记录一次BitmapFactory.decodeStream()、BitmapFactory.decodeFile()返回值为空的情况

1、测试手机
OPPO R9s 系统:6.0.1
MATE 20 系统:9
2、需求
拍照后将照片保存到一个指定的路径。
3、思路
拍照的时候通过intent传递了一个URI对象,保存图片的时候通过uri.getPath();获取路径,
通过
tBitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(mFile.getPath()));
获取bitmpa对象,然后将bitmap保存。
4、描述

最早使用OPPO R9s的时候没有问题,

BitmapFactory.decodeStream(new FileInputStream(mFile.getPath()))

能正常的返回bitmap对象,但是在MATE 20上运行抛了异常FileNotFoundException,首先怀疑是不是权限的问题,排查了日志跟权限无关,断点的时候发现了不同,如下:
MATE 20:
uri.getPath()=/external_files/DCIM/Camera/1594798642629aaaa.jpg
mFile.getPath()=/storage/emulated/0/DCIM/Camera/1594798642629aaaa.jpg

OPPO R9s:
uri.getPath()=/storage/emulated/0/DCIM/Camera/1594799170210aaaa.jpg
mFile.getPath()= /storage/emulated/0/DCIM/Camera/1594799170210aaaa.jpg

为什么在Mate 20上面uri.getPath()和mFile.getPath()返回值不同呢?
拍照时为了适配7.0及以上版本,拍照传递的MediaStore.EXTRA_OUTPUT做了如下的改动:

a.清单文件中的配置:

<meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" />

b.以下是file_paths.xml中内容:

<paths>
    <external-path name="external_files" path="." />
</paths>

c.判断版本

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
    uri = Uri.fromFile(mFile);
} else {
    uri = FileProvider.getUriForFile(this, "com.lkt.demo.fileprovider", mFile);
}

综上:uri赋了不同的值,所以导致uri.getPath()和mFile.getPath() 的返回值不同,在

new FileInputStream(mFile.getPath())

的时候抛了异常。
在需要文件路径的时候统一用mFile.getPath(),问题解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值