You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:40:25