【问题标题】:How long can I use the URI from ActivityResultContracts.GetContent() for?我可以使用 ActivityResultContracts.GetContent() 中的 URI 多长时间?
【发布时间】:2022-06-29 12:22:52
【问题描述】:

基本上,我试图让用户从手机的图片库中选择图片作为我的应用中的背景图片。

这是我的代码:

private val pickImages = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
    // e.g. content://com.android.providers.media.documents/document/image%3A31
    android.util.Log.d("dev-", "uri = $uri?.toString()")
    uri?.let {
        // save uri to my DB, etc.
    }
}

我担心的是:如果用户删除图像或切换到新手机会发生什么。 URI 应该中断,对吧?更好的方法是将图片保存到我的本地应用存储并保存指向那里的 URI?

但是,我尝试从手机图库中删除图片,重置图库缓存,关闭并重新打开应用程序,重新启动手机......我仍然可以在我的应用程序中使用图片。

真的有必要创建我自己的文件副本吗?

registerForActivityResult(ActivityResultContracts.GetContent()) 给我的 URI 能持续多久?

我找到了这个SO postthis article by CommonsWare,但网上没有其他内容,我还没有遇到任何错误...

注意:我一直在测试 Android 12 API 31。

更新

我终于找到了official documentation that answers my question

当您的应用打开文件进行读取或写入时,系统会为您的应用授予该文件的 URI 权限授予,该权限一直持续到用户的设备重新启动。

【问题讨论】:

  • 你在问两件事。 uri 持续多长时间以及是否必须制作副本。令人困惑。
  • 一旦你关闭你的活动,你就不再拥有获取的 uri 的读取权限。你可以很简单地检查。
  • 我已经关闭了应用程序,当我重新打开应用程序时,我仍然能够访问 URI。
  • Mmmm .. 在 Android 12 上,即使应用程序关闭,活动通常也不会被杀死。强制关闭应用进行测试。
  • 我以前没听说过...我已经关闭了应用程序并重新启动了手机。我仍然可以访问 URI 没问题。

标签: android image uri android-image registerforactivityresult


【解决方案1】:

我担心的是:如果用户删除图像或切换到新手机会发生什么。 URI 应该会中断,对吧?

通常会。更重要的是,一旦您的应用进程终止,您可能无法使用该 Uri

但是,我尝试从手机图库中删除图片,重置图库缓存,关闭并重新打开应用程序,重新启动手机......我仍然可以在我的应用程序中使用图片。

您不应该假设它适用于所有 Android 操作系统版本、Android 设备型号、图库应用等。您似乎已经在数以万计的设备型号上测试过,使用的操作系统版本目前,被一小部分用户群使用。

OTOH,如果您是您应用的唯一用户,并且只在此设备上使用,那么欢迎您做任何您想做的事情。

真的有必要创建我自己的文件副本吗?

这取决于你的目标。

您可以使用OpenDocument 代替GetContent,并使用takePersistableUriPermission() 来获得对该内容的长期访问权限。这是“附加”操作:您希望将内容附加到您的应用程序,但您很乐意让外部工具管理该内容。这处理进程被终止的场景和电话被重新启动的场景。它不处理 user-nuked-the-content-from-orbit 场景、user-modified-the-content 场景等。

如果您需要访问内容而不考虑外部用户操作,请复制该内容。这是“导入”操作:您希望内容的副本由您的应用专门管理。

【讨论】:

  • 对于我的用例,我可能会选择takePersistableUriPermission()。您在哪里找到说明来自GetContent 的uri 持续多长时间的文档(我只是好奇)?我找不到任何关于它的官方 Android 文档。
  • @Lifes:这是我研究了六年左右的话题。 Here is my most recent blog post on the subject。其中一些来自与谷歌工程师的讨论。关于这个主题的文档是有限的。
  • 好的,谢谢您提供更多信息。令人讨厌的是,它没有记录在案……重要的是要了解您的应用程序。
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多