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还是直接读取文件都会失败。
修正步骤
存储完整的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(); } } });使用存储的完整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
相关产品推荐
相关产品推荐

