SecurityException:调用uid无权访问选择器uri

问题描述 投票:0回答:1

我正在使用

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,只是在每次我想展示它们时下载它们😬

android android-permissions android-storage
1个回答
0
投票

我该怎么做?

从某种程度上来说,答案是:希望用户不要卸载并重新安装应用程序。如果您预计这种情况会经常发生,那么这似乎是一个需要尝试解决的问题。

除了此应用程序安装之外,

Uri
值毫无用处。卸载应用程序后,与这些
Uri
值关联的任何权限都会“噗”。

存储此类

Uri
值对于“链接”类型的操作来说是很好的,您可以在其中处理因任何原因而损坏的链接。例如,用户可以删除图像;我的假设是,如果您尝试使用指向现已删除的图像的
Uri
,您的应用程序也会在这种情况下同样崩溃。一旦您弄清楚您希望在这种情况下拥有什么样的用户体验,您就可以决定是否可以将其扩展到卸载/重新安装场景。

如果您确定无法处理已删除图像的情况,那么您有更多的“导入”操作,您需要制作自己的内容副本并使用您控制的副本。而且,如果您想扩展该方法来处理卸载/重新安装,您将需要“制作图像副本并将其发送到我的 BE”。

每次我想展示它们时才下载它们

所以,缓存它们:

  • 当用户将图像导入您的应用程序时,将其复制到您的缓存并安排将其上传到您的BE
  • 如果您引用了未本地缓存的图像(卸载/重新安装、缓存逐出策略、设置中的“清除数据”等),请将其从 BE 下载到缓存中

在理想情况下,用户永远不会下载图像,因为他们只使用缓存的副本。

© www.soinside.com 2019 - 2024. All rights reserved.