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