我正在使用
fun Context.persistUriAccess(uri: Uri) {
grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
在用户使用
PickVisualMedia()
选择图像后从图库中访问图像。
一切正常,直到我卸载并重新安装应用程序🤦
此后,我无法再访问图像了:
SecurityException: Calling uid ( 10575 ) does not have permission to access picker uri: content://media/picker/0/com.android.providers.media.photopicker/media/1000012483
我试着去“全力以赴!让我们要求全部!”
private fun accessGallery() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_VISUAL_USER_SELECTED))
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO))
} else {
requestPermissions.launch(arrayOf(READ_EXTERNAL_STORAGE))
}
}
如此处所述:https://developer.android.com/about/versions/14/changes/partial-photo-video-access,但我仍然得到
SecurityException
并且屏幕上没有图像。
我该怎么做?我宁愿不复制图像并将它们发送到我的 BE,只是在每次我想展示它们时下载它们😬
我该怎么做?
从某种程度上来说,答案是:希望用户不要卸载并重新安装应用程序。如果您预计这种情况会经常发生,那么这似乎是一个需要尝试解决的问题。
除了此应用程序安装之外,
Uri
值毫无用处。卸载应用程序后,与这些 Uri
值关联的任何权限都会“噗”。
存储此类
Uri
值对于“链接”类型的操作来说是很好的,您可以在其中处理因任何原因而损坏的链接。例如,用户可以删除图像;我的假设是,如果您尝试使用指向现已删除的图像的 Uri
,您的应用程序也会在这种情况下同样崩溃。一旦您弄清楚您希望在这种情况下拥有什么样的用户体验,您就可以决定是否可以将其扩展到卸载/重新安装场景。
如果您确定无法处理已删除图像的情况,那么您有更多的“导入”操作,您需要制作自己的内容副本并使用您控制的副本。而且,如果您想扩展该方法来处理卸载/重新安装,您将需要“制作图像副本并将其发送到我的 BE”。
每次我想展示它们时才下载它们
所以,缓存它们:
在理想情况下,用户永远不会下载图像,因为他们只使用缓存的副本。