【问题标题】:No persistable permission grants found for UID 10208 [ Security Exception ]没有为 UID 10208 [安全异常] 找到可持久的权限授予
【发布时间】:2021-06-25 17:15:40
【问题描述】:

我在我的应用程序中使用图像选择器的存储访问框架。下面是代码

val types = arrayOf("image/png", "image/jpeg", "image/jpg")
val intent = Intents.createDocumentIntent(types, true)
if (canDeviceHandle(intent)) caller.startActivityForResult(intent, OPEN_GALLERY)

这是创建文档的意图

 fun createDocumentIntent(types: Array<String>, allowedMultiple: Boolean): Intent {
        return Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = if (!types.isNullOrEmpty()) {
                putExtra(Intent.EXTRA_MIME_TYPES, types)
                types[0]
            } else "*/*"
            putExtra(Intent.EXTRA_ALLOW_MULTIPLE, allowedMultiple)
            addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        }
    }

这是在 OnActivityResult 中

    private fun handleGalleryActivityResult(data: Intent?, callbacks: FilePicker.Callbacks) {
        if (data == null) return

        val files = mutableListOf<Uri>()
        when {
            data.clipData != null -> {
                val clipData = data.clipData ?: return
                (0 until clipData.itemCount).forEach { files.add(clipData.getItemAt(it).uri) }
            }
            data.data != null -> {
                files.add(data.data!!)
            }
            else -> return
        }

        files.forEach {
            val flags = data.flags and Intent.FLAG_GRANT_READ_URI_PERMISSION
            activity.contentResolver.takePersistableUriPermission(it, flags)
        }

        callbacks.onFilesPicked(files)
    }

我在排队时遇到崩溃

 activity.contentResolver.takePersistableUriPermission(it, flags)

在 onActivityResult 中。

我阅读了许多有关此崩溃的解决方案,例如添加持久性 (FLAG_GRANT_PERSISTABLE_URI_PERMISSION) 标志或添加 takePersistableUriPermission,但我已经有了这个但我仍然遇到了这个崩溃。到目前为止,我找不到任何解决方案,而且我的应用用户也在我的手机上遇到了这个问题,我自己无法重现它。

另外附注:我使用的是目标版本 -> 11

【问题讨论】:

    标签: android android-permissions securityexception storage-access-framework imagepicker


    【解决方案1】:

    替换:

    val flags = data.flags and Intent.FLAG_GRANT_READ_URI_PERMISSION
    

    与:

    val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
    

    您传递给takePersistableUriPermission() 的唯一值是FLAG_GRANT_READ_URI_PERMISSION 和FLAG_GRANT_WRITE_URI_PERMISSION,而您不知道data.flags 中有什么。

    【讨论】:

    • 我仍然遇到这个崩溃。我已经从代码中删除了 data.flags。 @CommonsWare
    • 我可以通过一次选择 ~540 张图像来重现崩溃。我读到有128个限制| 512 张图片,同时获得 Persistable Permission。
    • @FiXiT:啊!是的,如果您要选择那么多图像,那很可能是问题的根源。这个限制是不可改变的,至少对于现有的 Android 版本来说是这样,尽管他们总是希望他们为未来的 Android 版本提高它。不过,很可能总会有一些限制。另请注意,AFAIK 限制是每个 app,而不是每个 ACTION_OPEN_DOCUMENT 调用 - 两个 ACTION_OPEN_DOCUMENT 调用一次约 270 张图像应该会在第二批或第一批中为您提供类似的结果在具有 128 Uri 限制的设备上。
    • @FiXiT:基本上,takePersistableUriPermission() 背后的愿景是用于少量文档,而不是用于画廊或类似的图像。而且,由于您正在处理图像,您可能会考虑切换到查询 MediaStore 并展示您自己的图库 UI。
    猜你喜欢
    • 2016-04-12
    • 2017-06-24
    • 2016-11-26
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多