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

Android选取图片报错:No persistable permission grants found问题排查

解决Android选取图片时的持久化URI权限错误

我开发的Android应用包含以下功能:

  • 创建包含图片字段的对象
  • 从设备相册选取图片
  • 将对象存入Room数据库
  • 从数据库读取并展示数据及对应图片

在选取第二张图片时,点击图片触发了如下错误:

No persistable permission grants found for UID "number" and Uri content://media/...

原问题代码

图片选取逻辑:

val singlePhotoPickerLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.PickVisualMedia()){ imageUri ->
            if (imageUri != null){
                val contentResolver = context.contentResolver
                val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or
                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION

                try {
                    contentResolver.takePersistableUriPermission(imageUri, takeFlags)
                    viewModel.onEvent(AddPlantEvents.AddImageUri(imageUri))
                } catch (e: SecurityException) {
                    // Handle the SecurityException, e.g., show an error message
                    Log.e("PickVisualMedia", "Failed to take persistable permission", e)
                }
            }
    }

触发选取的按钮代码:

Button(
    modifier = Modifier
        .width(100.dp)
        .height(100.dp),
    onClick = {
        singlePhotoPickerLauncher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
    }) {
    Text(
        text = "Add Photo",
        textAlign = TextAlign.Center,
        fontSize = 19.sp)
}

问题原因与解决方案

最初未使用ContentResolver获取持久化URI时出现其他权限错误,添加后仍触发上述异常。最终发现问题出在权限标志上:移除Intent.FLAG_GRANT_WRITE_URI_PERMISSION标志后,代码即可正常运行。

修正后的图片选取逻辑代码:

val singlePhotoPickerLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.PickVisualMedia()){ imageUri ->
            if (imageUri != null){
                val contentResolver = context.contentResolver
                val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION

                try {
                    contentResolver.takePersistableUriPermission(imageUri, takeFlags)
                    viewModel.onEvent(AddPlantEvents.AddImageUri(imageUri))
                } catch (e: SecurityException) {
                    // Handle the SecurityException, e.g., show an error message
                    Log.e("PickVisualMedia", "Failed to take persistable permission", e)
                }
            }
    }

说明

使用ActivityResultContracts.PickVisualMedia选取图片时,系统默认仅授予读权限,请求写权限会导致持久化权限申请失败——因为媒体库并未授予该URI的写权限,进而触发SecurityException及后续的权限找不到错误。仅保留读权限即可满足从相册读取图片并持久化URI用于后续展示的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:07:20