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(),问题解决。