Android中如何通过Content URI在RecyclerView显示内部存储图片?
问题解决:RecyclerView中用Picasso加载Content URI图片空白
核心问题与修复步骤
1. 修复Picasso加载逻辑
你直接传入Content URI的字符串给Picasso,它无法正确解析为可用的Uri对象,需要先把字符串转换成Uri实例:
修改Adapter中的代码:
override fun onBindViewHolder(holder: DocViewHolder, position: Int) { val doc = docs[position] holder.binding.apply { // 将字符串形式的Content URI转为Uri对象 val imageUri = Uri.parse(doc.docImageList[0]) Picasso.get() .load(imageUri) .into(imageDoc) textDocName.text = doc.title textValidity.text = doc.validity } holder.itemView.setOnClickListener { onItemClickListener?.let { it(doc) } } }
2. 确保Content URI的持久访问权限
通过ACTION_GET_CONTENT获取的Content URI默认只有临时访问权限,APP重启后会失效,导致图片无法加载。需要获取持久权限:
第一步:修改图库选择Intent的权限标志
在configDocImageDialog方法中,给Intent添加持久权限标志:
.setPositiveButton(getString(R.string.gallery)) { _, _ -> val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" // 添加权限标志,允许持久访问 addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) } startActivityForResult(Intent.createChooser(intent, "Select: "), pathGallery) }
第二步:在onActivityResult中获取持久权限
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if(resultCode == RESULT_OK) { val selectedImage = data?.data ?: return // 空值判断,避免空指针 // 获取持久访问权限 val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION requireContext().contentResolver.takePersistableUriPermission( selectedImage, takeFlags ) val pathImage = selectedImage.toString() try { when (requestCode) { GALLERY_1 -> binding.imageDoc1.setImageURI(selectedImage) CAMERA_1 -> binding.imageDoc1.setImageURI(selectedImage) GALLERY_2 -> binding.imageDoc2.setImageURI(selectedImage) CAMERA_2 -> binding.imageDoc2.setImageURI(selectedImage) GALLERY_3 -> binding.imageDoc3.setImageURI(selectedImage) CAMERA_3 -> binding.imageDoc3.setImageURI(selectedImage) } imageList.add(pathImage) } catch (e: Exception){ e.printStackTrace() } } }
额外提示(相机部分)
你当前处理相机的代码存在问题:ACTION_IMAGE_CAPTURE默认返回的是缩略图的Bitmap,不是Content URI,所以data?.data会是空值。如果之后需要处理相机拍摄的图片,建议指定一个本地文件路径作为输出,再通过该路径加载图片。
内容的提问来源于stack exchange,提问作者Tods
相关产品推荐
相关产品推荐

