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

Android图库选图后显示失败:/Documents/Image:XXXX路径文件找不到

问题:图库选择图片后无法在RecyclerView中显示,提示文件找不到

点击按钮从图库选择图片,填充到RecyclerView时始终出现文件找不到的错误,路径格式为/Documents/Image:XXXX(XXXX为数字)。相关代码如下:

打开图库选择器的代码

ActivityResultLauncher<String> GetImageFromGallery = registerForActivityResult(new ActivityResultContracts.GetContent(),
        new ActivityResultCallback<Uri>() {
            @Override
            public void onActivityResult(@Nullable Uri uri) {
                if (uri != null) {
                    ArrayList<String> temp = new ArrayList<>(0);
                    temp.add(uri.getPath());
                    img_data.add(temp);
                    mAdapter.notifyDataSetChanged();
                }
            }
        });

// Button
Button btn_add = root.findViewById(R.id.btn_add_image);
btn_add.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        GetImageFromGallery.launch("image/*");
    }
});

RecyclerView适配器中加载图片的代码

try {
    viewHolder.getphoto().setImageBitmap(BitmapFactory.decodeStream(viewHolder.getphoto().getContext().getApplicationContext().getContentResolver().openInputStream(Uri.parse(localDataSet.get(position).get(0)))));

//Or viewHolder.getphoto().setImageBitmap(BitmapFactory.decodeFile(localDataSet.get(position).get(0)));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

解决方案

错误原因

核心问题是你存储的是uri.getPath()的结果,但ActivityResultContracts.GetContent()返回的是内容Uri(格式为content://xxx),uri.getPath()得到的只是Uri的路径部分(比如/Documents/Image:XXXX),这个字符串既不是真实的文件系统路径,也不是完整的Uri(缺少content://协议头),导致后续无论是解析Uri还是直接读取文件都会失败。

修正步骤

  1. 存储完整的Uri字符串
    修改选择图片后的回调代码,存储uri.toString()而不是uri.getPath():

    ActivityResultLauncher<String> GetImageFromGallery = registerForActivityResult(new ActivityResultContracts.GetContent(),
            new ActivityResultCallback<Uri>() {
                @Override
                public void onActivityResult(@Nullable Uri uri) {
                    if (uri != null) {
                        ArrayList<String> temp = new ArrayList<>(0);
                        temp.add(uri.toString()); // 存储完整的Uri字符串
                        img_data.add(temp);
                        mAdapter.notifyDataSetChanged();
                    }
                }
            });
    
  2. 使用存储的完整Uri加载图片
    在适配器中解析存储的Uri字符串,通过ContentResolver正确加载图片:

    try {
        // 解析完整的Uri字符串
        Uri imageUri = Uri.parse(localDataSet.get(position).get(0));
        // 通过ContentResolver打开输入流
        InputStream inputStream = viewHolder.getphoto().getContext().getContentResolver().openInputStream(imageUri);
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
        viewHolder.getphoto().setImageBitmap(bitmap);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    

更优方案:使用图片加载库(如Glide)

原生加载Bitmap需要处理很多细节(如内存优化、异常处理),推荐使用Glide这类成熟的图片加载库,代码更简洁且更稳定:

// 先在build.gradle中添加依赖
// implementation 'com.github.bumptech.glide:glide:4.16.0'
// annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'

Glide.with(viewHolder.getphoto().getContext())
     .load(localDataSet.get(position).get(0)) // 直接传入存储的Uri字符串
     .into(viewHolder.getphoto());

内容的提问来源于stack exchange,提问作者Learning from masters

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:35:25