Android 从ContentProvider提供图像和其他文件服务

Android 从ContentProvider提供图像和其他文件服务,android,image,android-contentprovider,Android,Image,Android Contentprovider,我四处搜索,发现了有关存储和检索ContentProvider文件的问题,但我的情况有点不同 我正在构建一个应用程序,该应用程序将为我们的其他应用程序之一托管内容。可以将其视为一种销售内容而不实际进行应用内购买的方式 它目前正在工作,但我必须将图像复制到缓存中,以便从openFile传回的ParcelFileDescriptor有效。我希望有人可能知道如何从与应用程序捆绑的文件中引用和任意使用ParcelFileDescriptor。资产似乎不利于这一点。Raw很可能是相同的场景 让我试着用例子

我四处搜索,发现了有关存储和检索ContentProvider文件的问题,但我的情况有点不同

我正在构建一个应用程序,该应用程序将为我们的其他应用程序之一托管内容。可以将其视为一种销售内容而不实际进行应用内购买的方式

它目前正在工作,但我必须将图像复制到缓存中,以便从openFile传回的ParcelFileDescriptor有效。我希望有人可能知道如何从与应用程序捆绑的文件中引用和任意使用ParcelFileDescriptor。资产似乎不利于这一点。Raw很可能是相同的场景

让我试着用例子来解释。。。 如果我将所有文件都存储在资产中(我目前正在使用资产),那么这就是我所期望的工作方式

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

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

这是我问题的核心。。。有没有一种方法可以将要从ContentProvider提供的静态文件(任何类型)捆绑起来,而不必将其复制到缓存中

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


这有意义吗?:-)

你们看到了吗?

所以,随着Android应用程序“账单”即将推出,这对我来说可能不是问题。但总的来说,这仍然是一个公平的问题。可能需要将静态资产从内容提供商提供给其他应用程序。我还没有弄清楚如何不重复这些资产。哦。。。除了将应用程序大小增加一倍外,复制操作也很慢。因此,空缓存命中可能非常昂贵。根据您提供的内容类型的不同,这可能会带来糟糕的体验。我很久以前就开始这样做了,我想不起来了…:-)但我会的!我会让你知道的。从文件上看,这似乎是可行的。但这让我想知道我以前怎么没看到它。。。
@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;
}