传送门:安卓开发中的系统版本兼容的注意事项(一)(Android5.0 API21)
安卓开发中的系统版本兼容的注意事项(二)(Android6.0 API23)
安卓开发中的系统版本兼容的注意事项(四)(Android8.0 API26)
作为安卓开发者最头疼的一点,莫过于谷歌越来越快的版本更新速度。以及升级编译版本后需要面对的大量兼容性异常。尤其是今年电信终端产业协会(TAF)发布了《移动应用软件高API等级预置与分发自律公约》。https://baike.baidu.com/item/移动应用软件高API等级预置与分发自律公约/22759862
逼着你升级,想不升级都不行。
下面将根据自己实际项目中升级开发版本的经验,对每个版本的注意事项做一下总结性回顾。方便自己以后查阅方便,也可以给有这方面需求的新手提供一点借鉴。
升级到7.0+以后,我们会发现,在使用Uri.fromFile()打开系统相机拍照或选取照片,以及APP使用系统安装更新版本等功能时。APP直接异常崩溃了, 后台异常提示为:FileUriExposedException
7.0以上系统不再允许在app中把file://Uri暴露给其他app,包括但不局限于通过Intent或ClipData 等方法。
原因在于使用file://Uri会有一些风险,比如:
file://Uri
的app无法访问该文件。READ_EXTERNAL_STORAGE
权限,在读取文件时会引发崩溃。谷歌提供了FileProvider这个类
,使用它可以生成content://Uri
来替代file://Uri
。这样就可以避免该异常的发生了。
使用方法如下:
1.首先在AndroidManifest.xml
中声明FileProvider
"com.shengcai.fileprovider"是授权参数,后面会用到,可自行修改
file_paths是你自己创建的xml文件名,也可以任意修改。
2.然后我们在res中创建file_paths.xml文件
这里可用的节点类型和对应的路径说明如下:
这里我只用了3种常用的文件路径:getFilesDir()
.,getCacheDir()
.和getExternalStorageDirectory()
.
path内容填空则表示从根目录开始。
3.最后我们修改代码,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri uri= FileProvider.getUriForFile(mContext, "com.shengcai.fileprovider", file);
}else{
Uri uri= Uri.fromFile(file);
}
这里的"com.shengcai.fileprovider"就是我们在AndroidManifest中声明的授权参数,一定要保持一致。另外代码也要做版本区分。
实际适配时,我们全局搜索Uri.fromFile方法然后做出兼容处理。这样,我们就可以轻松的解决掉这个异常啦。