无法设置图像 URI,因为权限被拒绝:打开提供程序



好后, 我用房间数据库装箱一个应用程序来保存项目(名称、描述、价格、图像(。我有3项活动。创建的第一个活动,第二个带有回收器视图的主要活动以及最后一个活动(更改活动(当我单击主活动中的项目时打开。当我创建一个项目时,我选择图像并将 uri 保存在数据库中。我想在ChangeActivity的ImageView中设置图像,但得到Unable to start activity ComponentInfo {hop.test.aah/hop.test.aah.ChangeActivity}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{7a3e034 25078:hop.test.aah/u0a95} (pid=25078, uid=10095) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs. 我尝试了一些我发现的解决方案,但没有帮助,或者我错了,这就是我寻求帮助的原因。

变更活动:

在清单中,我只添加READ_EXTERNAL_PERMISSION和WRITE_EXTERNAL权限。 这是我选择图像的方式:

UPD 2:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
val resolver = applicationContext.contentResolver
val flags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
resolver.takePersistableUriPermission(image!!, flags)
and fun to get
@Throws(IOException::class)
fun getBitmapFromUri(uri: Uri): Bitmap {
val parcelFileDescriptor: ParcelFileDescriptor? =
contentResolver.openFileDescriptor(uri, "r")
val fileDescriptor: FileDescriptor = parcelFileDescriptor!!.fileDescriptor
val image: Bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor)
parcelFileDescriptor.close()
return image
}

这对我有用:

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/jpeg"
startActivityForResult(
Intent.createChooser(
intent,
getString(R.string.chooser_title)
), RC_GALLERY)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
if (requestCode == RC_GALLERY) {
imgUri = data?.data
val contentResolver = applicationContext.contentResolver
val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
imgUri?.let { contentResolver.takePersistableUriPermission(it, takeFlags) }
}
}
}

步骤#1:切换到ACTION_OPEN_DOCUMENT

步骤#2:在onActivityResult()中,当您获得Uri时,请拨打takePersistableUriPermission()ContentResolver

然后,也只有这样,您才能将Uri保存在数据库中,并在将来使用它来访问内容。

使用当前的方法,Uri适用于接收onActivityResult()调用的活动,但不适用于将来的流程。

相关内容

最新更新