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
相关产品推荐
相关产品推荐

