当前位置: 移动技术网 > 移动技术>移动开发>Android > 记录一次BitmapFactory.decodeStream()、BitmapFactory.decodeFile()返回值为空的情况

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

2020年07月17日  | 移动技术网移动技术  | 我要评论
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(),问题解决。

本文地址:https://blog.csdn.net/m0_37273831/article/details/107363134

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网