安卓开发中的系统版本兼容的注意事项(三)(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

谷歌的官方解释如下:

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

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.shengcai.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <!--元数据-->
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

"com.shengcai.fileprovider"是授权参数,后面会用到,可自行修改

file_paths是你自己创建的xml文件名,也可以任意修改。

2.然后我们在res中创建file_paths.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <files-path name="my_files" path="" />
        <external-path name="my_external" path=""/>
        <cache-path name="my_cache" />
    </paths>
</resources>


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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值