在我的应用程序中,我使用手机图库中的图像。我接收 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/...
如果您想稍后或在不同的活动中使用 uri,请获取持久 uri 权限。
当我得到 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
}
似乎有效...