android - 在Android中打开位图时FileNotFound
问题描述
我收到以下异常
java.io.FileNotFoundException: No content provider: /my_images/IMG_20210611_171332_9015407964570520530.jpg
at android.conten...
对于这行代码
Bitmap bitmap = android.provider.MediaStore.Images.Media.getBitmap(context.getContentResolver(), fileUri);
不幸的是,我没有完整的堆栈跟踪,因为我用于记录的 AppCenter 正在截断消息。
我正在运行此代码以响应我们从手机的默认相机应用程序返回到此应用程序的活动结果。
我们在一小部分情况下会收到此错误,而不是在所有经过测试的手机上。
即使错误显示 FileNotFoundException,是否有可能是由于读取图片时 RAM 不足引起的?
附加信息 传递给 ACTION_IMAGE_CAPTURE 意图的图像文件名是这样生成的:
File storageDir = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDir);
Uri fileUri = FileProvider.getUriForFile(activity, "com.mycompany.myapp.saveimageprovider", image);
解决方案
发生这种情况有两个原因:
重新创建活动
当在某些(主要是三星)手机上以横向模式拍摄照片时,当从相机返回并运行 onCreate 时,应用程序被重新创建。
文件 uri 存储错误
当我的本地字段存储在 onSaveInstanceState 中时,我使用 fileUri.getPath() 来存储发送到相机的照片 uri。不幸的是 getPath() 只返回
/my_images/IMG_20210614_205615_6745415510162969966.jpg
应该是的整个路径
内容://com.mycompany.myapp.saveimageprovider/my_images/IMG_20210614_205615_6745415510162969966.jpg
在 onSaveInstanceState 中使用 fileUri.tostring 后,一切都开始工作了。
推荐阅读
- symfony - 您没有足够的权限来打开元素或执行所需的操作
- javascript - Firebase - IN查询在where子句中不起作用,结果是空白数组
- java - 根据其他列表中的匹配对象更新列表中两个对象的属性
- python - 熊猫数据框。聚合列取决于另一列中的值
- reactjs - 单击后如何更改 React js 上的按钮材质 UI 标签的颜色?
- sql - SQL 使用 Select 语句匹配来自 2 个不同表的列
- python - Django:如何切换两个对象之间的关系
- angular - 如何防止 Angular Material DatePicker 切换月份和日期?
- java - 有没有办法用重复的 if-then 模式来简化代码?
- java - Android:由于活动无法获得焦点而被 Android 杀死的活动