Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to take persistable uri permission with PickVisualMedia()

In my app I use images from phone galery. I recive uri and write it to database. When I want to use this uri I get error, for example: 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

On start my app I send request for permissions:

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

        )
    )

    SideEffect() {
        permissionState.launchMultiplePermissionRequest()
    }

But I get error when:

 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)
 .....

}

enter image description here

The problem appears on API > 29

For API > 29 I use:

 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)
         

(img is String)

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

like image 847
Сергей В Avatar asked Oct 31 '25 07:10

Сергей В


1 Answers

when I get uri write next line:

  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 
    }

seems to work...

like image 122
Сергей В Avatar answered Nov 01 '25 23:11

Сергей В



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!