安卓开发中的系统版本兼容的注意事项(三)(Android7.0 API24)

传送门:安卓开发中的系统版本兼容的注意事项(一)(Android5.0 API21)

               安卓开发中的系统版本兼容的注意事项(二)(Android6.0 API23)

               安卓开发中的系统版本兼容的注意事项(四)(Android8.0 API26)

作为安卓开发者最头疼的一点,莫过于谷歌越来越快的版本更新速度。以及升级编译版本后需要面对的大量兼容性异常。尤其是今年电信终端产业协会(TAF)发布了《移动应用软件高API等级预置与分发自律公约》。https://baike.baidu.com/item/移动应用软件高API等级预置与分发自律公约/22759862

逼着你升级,想不升级都不行。

下面将根据自己实际项目中升级开发版本的经验,对每个版本的注意事项做一下总结性回顾。方便自己以后查阅方便,也可以给有这方面需求的新手提供一点借鉴。

一、应用间共享文件 FileProvider

升级到7.0+以后,我们会发现,在使用Uri.fromFile()打开系统相机拍照或选取照片,以及APP使用系统安装更新版本等功能时。APP直接异常崩溃了, 后台异常提示为:FileUriExposedException

谷歌的官方解释如下:安卓开发中的系统版本兼容的注意事项(三)(Android7.0 API24)_第1张图片

7.0以上系统不再允许在app中把file://Uri暴露给其他app,包括但不局限于通过Intent或ClipData 等方法。

原因在于使用file://Uri会有一些风险,比如:

  • 文件是私有的,接收file://Uri的app无法访问该文件。
  • 在Android6.0之后引入运行时权限,如果接收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文件



    
        
        
        
    



这里可用的节点类型和对应的路径说明如下:

安卓开发中的系统版本兼容的注意事项(三)(Android7.0 API24)_第2张图片

这里我只用了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方法然后做出兼容处理。这样,我们就可以轻松的解决掉这个异常啦。

你可能感兴趣的:(安卓开发中的系统版本兼容的注意事项(三)(Android7.0 API24))