【发布时间】: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 post 和this 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