Android相机拍摄图片无法加载至ImageView问题求助
解决Android相机拍照后FileNotFoundException问题
问题分析
你遇到的java.io.FileNotFoundException: /external_files/Pictures/DeKa/image.jpg错误,核心原因有两个:
- FileProvider生成的
fileUri是虚拟路径,BitmapFactory.decodeFile()无法直接识别这个路径,它只能读取真实的文件系统路径。 selectImage()中调用onDestroy()和this.onCreate(null)会强制重建Activity,导致全局变量fileUri丢失,拍照返回后无法正确定位文件。
修复步骤
1. 移除错误的Activity重建代码
直接删除selectImage()方法里的这两行:
onDestroy(); this.onCreate(null);
这两行完全没必要,会破坏Activity的正常生命周期,导致变量状态丢失。
2. 保存并恢复fileUri,避免Activity重建丢失
将fileUri设为全局变量,并重写onSaveInstanceState和onRestoreInstanceState方法,确保Activity重建后能恢复fileUri:
private Uri fileUri; @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("saved_file_uri", fileUri); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); fileUri = savedInstanceState.getParcelable("saved_file_uri"); }
3. 正确读取FileProvider对应的图片
替换onActivityResult中相机部分的读取逻辑,通过ContentResolver打开输入流读取图片,而不是直接用文件路径:
if (requestCode == REQUEST_CAMERA) { try { InputStream inputStream = getContentResolver().openInputStream(fileUri); bitmap = BitmapFactory.decodeStream(inputStream); setToImageView(getResizedBitmap(bitmap, max_resolution_image)); if (inputStream != null) { inputStream.close(); } } catch (Exception e) { e.printStackTrace(); } }
4. 优化文件命名与权限检查
- 避免文件名重复覆盖:修改
getOutputMediaFile()中的文件名,加入时间戳:
File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
- 权限验证:确保在
AndroidManifest.xml中声明必要权限,且在运行时动态申请:
<!-- Android 10及以下 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13+ --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
内容的提问来源于stack exchange,提问作者Martin Hetzenegger
相关产品推荐
相关产品推荐

