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

Android返回第二个Activity后ImageView不显示图片,报ENOENT错误求助

解决BitmapFactory解码图片时的FileNotFoundException问题

嘿,我来帮你排查这个头疼的问题!从你给出的Log来看,系统明明找不到指定路径的图片文件,但你又确认URI和路径是对的,这里面大概率是权限或者Android存储机制的坑,咱们一步步来拆解解决:

1. 别只加相机权限——存储权限才是关键

相机权限只是允许你调用相机拍照,但要读写外部存储里的图片(比如你路径里的/storage/emulated/0),还需要对应的存储权限,而且不同Android版本要求不一样:

  • Android 10及以下:必须在Manifest里添加读写权限,还要在运行时动态申请(因为是危险权限):
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
    
  • Android 11+:Scoped Storage默认启用,直接用绝对路径访问文件会受限。如果是你自己APP拍摄的图片,优先用App专属目录(getExternalFilesDir(Environment.DIRECTORY_PICTURES)),或者用MediaStore API来操作,尽量避免申请敏感的MANAGE_EXTERNAL_STORAGE权限。

2. 先验证文件是否真的存在

你看到的路径可能只是逻辑路径,但实际文件可能没保存成功,或者路径有拼写错误。可以加一段代码验证:

File imageFile = new File("/storage/emulated/0/Pictures/FotoAula/IMG_20180329_183302.jpg");
if (imageFile.exists()) {
    Log.d("IMAGE_CHECK", "文件存在,大小:" + imageFile.length() + "字节");
} else {
    Log.e("IMAGE_CHECK", "文件不存在!");
    // 打印父目录下的所有文件,看看实际有什么
    File parentDir = imageFile.getParentFile();
    if (parentDir != null && parentDir.exists()) {
        String[] filesInDir = parentDir.list();
        if (filesInDir != null) {
            for (String fileName : filesInDir) {
                Log.d("IMAGE_CHECK", "目录下的文件:" + fileName);
            }
        }
    }
}

这段代码能帮你确认文件到底有没有被正确保存到指定路径。

3. 适配Android 10+的Scoped Storage限制

从Android 10开始,直接通过绝对路径访问外部存储文件会被限制,即使你加了权限。这时候推荐用ContentResolver + Uri来加载图片,而不是硬编码路径:

// 假设你已经拿到了图片的Content Uri
try {
    InputStream inputStream = getContentResolver().openInputStream(imageUri);
    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    yourImageView.setImageBitmap(bitmap);
    inputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

如果是通过Intent传递Uri到第二个Activity,别忘了给Intent添加读取权限:

Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("imageUri", imageUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);

4. 避免硬编码路径,用系统API获取目录

硬编码/storage/emulated/0/Pictures可能在某些设备上不兼容,建议用系统API获取标准目录:

// 获取公共Pictures目录
File picturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File fotoAulaDir = new File(picturesDir, "FotoAula");
// 确保目录存在
if (!fotoAulaDir.exists()) {
    fotoAulaDir.mkdirs();
}
// 生成图片文件
File imageFile = new File(fotoAulaDir, "IMG_20180329_183302.jpg");

内容的提问来源于stack exchange,提问作者irfan sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:55:28