如何将持久化 URI 用于不支持 ACTION_OPEN_DOCUMENT 的应用程序

How can I utilize a persisted URI with apps that don't support ACTION_OPEN_DOCUMENT

我的应用程序允许用户从他们最喜欢的任何应用程序中 select 媒体(图像、视频、音频)来浏览这些文档。然后我将 URI 存储到该图像(而不是下载整个图像)到数据库中。在重新启动应用程序时,我需要利用这些 URI 来提取缩略图和图像,从 URI 中提取完整图像,以便在应用程序中显示它们。

我已经阅读了关于最初使用 ACTION_OPEN_DOCUMENT 的各种帖子和文档,授予适当的 URI 权限,然后在解析器上使用 takePersistableUriPermission。

一切都很好。问题是,世界上有 很多 管理媒体选择的应用程序不支持 ACTION_OPEN_DOCUMENT,但支持 ACTION_GET_CONTENT。

我想做的事情:

  1. 提供一个应用程序列表,以允许用户选择他们已加载的应用程序,这些应用程序可以为他们找到他们想要在我的应用程序中使用的媒体。
  2. 使用 selected 应用选择媒体。
  3. 将该媒体的 URI 保存到数据库中,以便我以后可以使用它。

当实现 select 应用程序用于查找媒体的初始意图是 ACTION_OPEN_DOCUMENT 时,这非常有效。

我不需要在媒体上执行写入 - 只需打开 selection(并利用用户选择的结果 URI),并存储此 URI 供以后使用。

如何在不支持 ACTION_OPEN_DOCUMENT intent 的应用程序中弥合需要持久 URI 的差距?

如果你想使用ACTION_GET_CONTENT:

第 1 步:将数据复制到您控制的某个文件(在内容上打开 InputStream 并将字节复制到 FileOutputStream

第 2 步:保留指向您的数据副本的 Uri

换句话说,无法保证您从 ACTION_GET_CONTENT 返回的 Uri 在五分钟内有用,更不用说五小时、五天、五周等了。

或者,集成 file chooser library 并将自己限制在文件系统上对您可见的文件。