You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ACTION_OPEN_DOCUMENT选超100个文件时takePersistableUriPermission报错怎么办

问题根因

Android系统针对ACTION_OPEN_DOCUMENT多选文件场景存在隐式的URI临时授权数量限制,绝大多数ROM的限制阈值为99~100个文件:当用户单次选择文件数超过阈值时,系统仅会给前100个URI自动授予临时读写权限,超出部分的URI不会附带临时权限,因此调用takePersistableUriPermission申请持久化权限时会直接抛出无权限的异常。

解决方案
  • 删除冗余的自授权代码
    ACTION_OPEN_DOCUMENT返回的合法URI,系统已经自动为当前应用授予临时权限,不需要自己调用grantUriPermission给自己的包名授权,这行代码属于冗余逻辑,多文件场景下反而可能触发权限校验异常,直接删除即可。

  • 增加权限校验逻辑
    调用takePersistableUriPermission之前先校验当前URI是否已经获得临时权限,仅对有权限的URI申请持久化授权,避免抛出异常:

    @Throws(Exception::class)
    fun grantReadPermissionToUri(context: Context, uri: Uri) {
        val hasPermission = context.contentResolver.checkUriPermission(
            uri,
            android.os.Binder.getCallingPid(),
            android.os.Binder.getCallingUid(),
            Intent.FLAG_GRANT_READ_URI_PERMISSION
        ) == android.content.pm.PackageManager.PERMISSION_GRANTED
    
        if (hasPermission) {
            context.contentResolver.takePersistableUriPermission(
                uri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION
            )
        } else {
            // 可在此处添加无权限URI的统计/提示逻辑
        }
    }
    
  • 限制单次选择文件数量
    在收到文件选择结果时先判断选中的文件数,如果超过99个直接提示用户分批次选择,从根源上避免触发系统限制:

    // 在setResultLaunchers的回调中,获取uriList后先判断数量
    if (uriList.size >= 100) {
        Toast.makeText(this, "单次最多选择99个文件,请分批次导入", Toast.LENGTH_SHORT).show()
        return@registerForActivityResult
    }
    
  • 增加异常捕获兜底
    在调用takePersistableUriPermission的外层增加SecurityException捕获,避免单文件权限问题导致整个导入流程崩溃。

内容的提问来源于stack exchange,提问作者qsspy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:15:03