【问题标题】:Serving images and other files from a ContentProvider从 ContentProvider 提供图像和其他文件
【发布时间】:2011-01-28 20:01:31
【问题描述】:

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

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

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

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

@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 的应用程序,但它似乎指向整个资产目录。 在阅读了一段时间的 intertubes 之后,似乎资产不允许描述符从与其关联的应用程序外部引用它(不过,我没有这方面的引用)。

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

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

即使我要使用 sqlite 并将文件存储为 blob,我也必须制作数据库的初始副本以使其可写......所以它是相同的结尾。

这有意义吗? :-)

【问题讨论】:

  • 因此,随着 Android 即将推出的应用内“计费”功能的发布,这对我来说可能不是问题。但总的来说,这仍然是一个公平的问题。可能需要从内容提供者向其他应用程序提供静态资产。而且我还没有弄清楚如何不复制这些资产。
  • 哦...除了应用程序大小翻倍之外,复制操作也很慢。因此,空缓存命中可能非常昂贵。根据您提供的内容类型,这可能会带来糟糕的体验。

标签: android image android-contentprovider


【解决方案1】:

【讨论】:

  • 我很久以前就离开了,我不记得了...... :-) 但我会的!我会让你知道的。从文档中听起来它会起作用。但这只是让我想知道我以前怎么没有看到它......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2017-04-07
相关资源
最近更新 更多