Android 从库中获取图像URI并将其传递给其他活动,无法查看图像,获取异常

Android 从库中获取图像URI并将其传递给其他活动,无法查看图像,获取异常,android,kotlin,Android,Kotlin,我有一个活动,从中启动图库,选择一个图像,并希望在另一个活动中显示所选图像。我参考了以下解决方案并实现了相同的解决方案 虽然我能够将URI传递给下一个活动,但在图像视图上看不到任何内容。任何关于我哪里出错的帮助,谢谢 btn_launch_gallery.setOnClickListener { val requestCode = 0 val launchGalleryIntent = Intent(Intent.ACTION_PICK,

我有一个活动,从中启动图库,选择一个图像,并希望在另一个活动中显示所选图像。我参考了以下解决方案并实现了相同的解决方案

虽然我能够将URI传递给下一个活动,但在图像视图上看不到任何内容。任何关于我哪里出错的帮助,谢谢

btn_launch_gallery.setOnClickListener {

            val requestCode = 0
            val launchGalleryIntent = Intent(Intent.ACTION_PICK, 
                                             MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
            startActivityForResult(launchGalleryIntent, requestCode)
        }
我的OnActivityResult看起来像这样,基本上实现了与上面引用的示例相同的功能

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

        super.onActivityResult(requestCode, resultCode, data)


        if (requestCode === 0 && resultCode === Activity.RESULT_OK ) {
            val selectedImage: Uri? = data?.data
            val picturePath = getRealPathFromURI(
                selectedImage,
                this
            )
            val intent = Intent(this, LogFoodDetail::class.java)
            intent.putExtra("image_from_gallery", picturePath)

            try {
                startActivity(intent)
            }
            catch (e: Exception)
            {
                e.printStackTrace()
                Log.e("Error",e.printStackTrace().toString())
            }
        }
    }

    fun getRealPathFromURI(contentURI: Uri?, context: Activity): String? {
        val projection =
            arrayOf(MediaStore.Images.Media.DATA)
        val cursor = context.managedQuery(
            contentURI, projection, null,
            null, null
        )
            ?: return null
        val column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
        return if (cursor.moveToFirst()) {
            // cursor.close();
            cursor.getString(column_index)
        } else null
        // cursor.close();
    }
在我的下一个活动中,我得到了这样的意图,并将URI传递给ImageView。但是,我看不到图像。我得到以下错误-W/System.err:java.io.FileNotFoundException:No content provider:/storage/emulated/0/DCIM/Camera/***.jpg

val resId = intent.getStringExtra("image_from_gallery")
val imgThumbnail: ImageView = findViewById(R.id.food_thumbnail)
        try{
            val imageStream: InputStream? = contentResolver.openInputStream(Uri.parse(resId))
            val bitmap = BitmapFactory.decodeStream(imageStream)
            imgThumbnail.setImageBitmap(bitmap)
        }
        catch (e: Exception)
        {
          e.printStackTrace()
        }
我在下一个活动中看到下图:

更新: 正如@blackapps在其回答中所评论的,将URI作为字符串传递给intent.putExtra()上的下一个活动,并在随后的活动中解析URI解决了它,OnActivityResult()中更新的代码是


不要将好的uri转换为文件系统路径

   Uri uri = data.getData();
将获得的uri直接传递给下一个活动

在那里你可以用它来

   imageView.setImageUri(uri);

除了uri,您还可以使用uri.toString()将uri作为字符串传递。

您可以使用以下命令直接加载本地图像uri:

imgThumbnail.setImageUri(yourUri);

您应该发送原始uri,然后将其直接设置到imageView,而不是将字符串路径发送到活动。

Hello@blackapps,感谢您的快速回复。当我尝试这样做时,我得到了以下错误-W/ImageView:resolveUri在错误的位图uri上失败:/storage/emulated/0/DCIM/Camera/IMG_***。jpgI说:不要将一个好的uri转换为文件系统路径。这意味着您将扔掉可怕的函数getRealPathFromURI。不要用它。现在再次阅读我的帖子。是的,先生,我做了以下更改:``intent.putExtra(“图片库中的图片”,选择了图片)。它生成以下异常:```异常:`` com.example.myapplication W/Bundle:尝试强制转换生成的内部异常:java.lang.ClassCastException:android.net.Uri$HierarchicalUri不能强制转换为java.lang.String``如何避免这种情况,我已经告诉过您:
您也可以将Uri作为字符串传递,而不是Uri使用uri.toString()。
所以
使用selectedImage.toString()
对于kotlin,它将是
selectedImage.string
我想。谢谢@blackapps。我之前尝试过使用字符串(),但它说URI不能转换为字符串或类似的内容。但现在,它似乎起了作用。
imgThumbnail.setImageUri(yourUri);