2011-01-28 45 views
3

我已经搜索并发现了关于从ContentProvider存储和检索文件的问题,但我的情况有点不同。提供来自ContentProvider的图像和其他文件

我正在构建一个应用程序,该应用程序将为我们的其他应用程序之一托管内容。把它想象成一种销售内容的方式,而不需要实际购买应用程序。

它目前正在工作,但我必须将图像的副本放入缓存中,以便从openFile传回的ParcelFileDescriptor有效。我希望有人可能知道如何从与应用程序捆绑在一起的文件中引用和随意使用ParcelFileDescriptor。资产似乎没有促进这一点。原始可能是相同的情况。

让我试着通过示例来解释... 这是我希望事情如果我将所有文件存储在资产(我目前是)的工作方式。

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) 
throws FileNotFoundException { 
    String fileName = uri.getEncodedPath(); 
    AssetFileDescriptor afd = getContext().getAssets().openFd(fileName); 
    ParcelFileDescriptor pfd = afd.getParcelFileDescriptor(); 
    return pfd; 
} 

但是,这当然不起作用。我得到一个有效的ParcelFileDescriptor返回到调用ContentResolver的应用程序,但它似乎指向整个资产目录。 在阅读了一段时间后,似乎资产不允许描述符从它与之相关的应用程序之外引用它(尽管我没有对此进行参考)。

我通过将所讨论的文件复制到托管ContentProvider的应用程序的缓存中,然后返回缓存文件的ParcelFileDescriptor来“解决”了问题。 这工作得很好......但我最终加倍了应用程序的大小。

这是我的问题的核心......有没有办法将一个静态文件(任何类型)从ContentProvider提供,而不必将其复制到缓存中。

即使我要使用sqlite并将文件存储为blob,我也必须创建数据库的初始副本,以便它可以写入...所以它的结尾是一样的。

这是否有意义? :-)

+0

因此,随着Android即将推出的应用程序“计费”的公布,这对我来说可能不是问题。但总的来说,这仍然是一个公平的问题。可能需要将静态资产从内容提供者提供给其他应用程序。我还没有弄清楚如何不重复这些资产。 – 2011-02-05 15:51:42

+0

噢......除了将应用程序大小加倍外,复制操作也很慢。所以空的缓存命中可能会非常昂贵。根据你所服务的内容类型的不同,这可能会导致糟糕的体验。 – 2011-03-18 14:57:04

回答