Android Can';无法设置图像URI,因为权限拒绝:正在打开提供程序

Android Can';无法设置图像URI,因为权限拒绝:正在打开提供程序,android,kotlin,android-room,Android,Kotlin,Android Room,再见, 我用一个带有房间数据库的应用程序来保存物品(名称、描述、价格、图像)。我有三项活动。创建的第一个活动、带有RecyclerView的第二个Main活动以及单击MainActivity中的项时打开的最后一个活动(ChangeActivity)。当我创建一个项目时,我选择图像并将uri保存在数据库中。我想在ChangeActivity的ImageView中设置图像,但得到 无法启动activity ComponentInfo{hop.test.aah/hop.test.aah.ChangeA

再见, 我用一个带有房间数据库的应用程序来保存物品(名称、描述、价格、图像)。我有三项活动。创建的第一个活动、带有RecyclerView的第二个Main活动以及单击MainActivity中的项时打开的最后一个活动(ChangeActivity)。当我创建一个项目时,我选择图像并将uri保存在数据库中。我想在ChangeActivity的ImageView中设置图像,但得到
无法启动activity ComponentInfo{hop.test.aah/hop.test.aah.ChangeActivity}:java.lang.SecurityException:权限拒绝:从ProcessRecord{7a3e034 25078:hop.test.aah/u0a95}(pid=25078,uid=10095)打开提供程序com.android.providers.media.MediaDocumentsProvider提供程序要求您使用ACTION\u OPEN\u文档或相关API获得访问权限
。 我尝试了一些我发现的解决方案,但没有任何帮助,或者可能是我错了,这就是我寻求帮助的原因

变更活动:

在清单中,我只添加了读取外部权限和写入外部权限。 这是我选择图像的方式:

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
    }
步骤1:切换到
操作\u打开\u文档

步骤2:在activityResult()上的
中,当您获得
Uri

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

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

这对我有效:

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

这回答了你的问题吗?您不需要任何权限。如果您存储uri并在以后使用它,则如果您使用ACTION\u GET\u CONTENT,则该uri不再有效。@AgentP这不是我的解决方案,因为我想在“活动”中设置已存在的图像。我试图有意使用此解决方案,但没有成功。@blackapps我将拾取的图像的uri保存在DB中,并尝试从DB为imageView设置图像uri。你推荐用什么?我尝试使用ACTION_PICK,但gallery没有打开,应用程序只是在Log中崩溃了,没有出现错误。您能解释一下更流行的使用方法吗?选中“请更新问题”。@saverasleemy:在
活动中调用
getContentResolver()
,以获取
ContentResolver
。您可以在中看到
takePersistableUriPermission()
的用法。我将其保存在DB中,但setImageURI不起作用。我真的不明白我做了什么分解器,获取uri,创建有趣的getBitmapFromUri(),在活动中,用户从imageView中的图库中选择图片,它通过
imageView.setImageBitmap(getBitmapFromUri(image))
显示。“image”是我在
val image=data?中得到的Uri。data
但在其他活动中,当我尝试
imageFromDatabase时。setImageBitmap(getBitmapFromUri(Uri))
“Uri”是
项。image
来自数据库或
intent.getStringExtra()
我尝试了所有操作。但它仍然不起作用。请再帮我一次。现在我得到了“无内容提供商:android.app.ContextImpl”$ApplicationContentResolver@65f567b" error@saverasleemy当前位置看起来你把错误的东西变成了字符串。您在
ContentResolver
上调用了
toString()。