如何使用 PickVisualMedia() 获取持久 uri 权限

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

在我的应用程序中,我使用手机图库中的图像。我接收 uri 并将其写入数据库。 当我想使用这个 uri 时,我会收到错误,例如:

java.lang.SecurityException: Calling uid ( 10192 ) does not have permission to access picker uri: content://media/picker/0/com.android.providers.media.photopicker/media/1000000033

启动我的应用程序时,我发送权限请求:

  val permissionState = rememberMultiplePermissionsState(
        listOf(
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.CAMERA

        )
    )

    SideEffect() {
        permissionState.launchMultiplePermissionRequest()
    }

但是我在以下情况下遇到错误:

 fun getImgBitmap(img: String, context: Context): Bitmap {
            val source: ImageDecoder.Source
            val bitmap: Bitmap

            source = ImageDecoder.createSource(context.contentResolver, Uri.parse(img))
            bitmap = ImageDecoder.decodeBitmap(source)
 .....

}

问题出现在 API > 29 上

对于 API > 29 我使用:

 val contentResolver = context.contentResolver
    val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or
                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION
          
   contentResolver.takePersistableUriPermission(Uri.parse(img), takeFlags)


  source = ImageDecoder.createSource(contentResolver, Uri.parse(img))
  bitmap = ImageDecoder.decodeBitmap(source)
         

并得到:

java.lang.SecurityException: No persistable permission grants found for UID 10195 and Uri content://media/...

android android-jetpack-compose android-permissions
2个回答
0
投票

如果您想稍后或在不同的活动中使用 uri,请获取持久 uri 权限。


0
投票

当我得到 uri 时,写下一行:

  val name = context.packageName
   context.grantUriPermission(name, it, Intent.FLAG_GRANT_READ_URI_PERMISSION)

val launcher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.PickVisualMedia()
    ) {it ->
                 **val name = context.packageName
                context.grantUriPermission(name, it, Intent.FLAG_GRANT_READ_URI_PERMISSION)**
        //savetodatabase 
    }

似乎有效...

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