一分钟解决Android7.0及其以上适配uri路径爆出FileUriExposedException异常

最近做公司APP(更新软件)调用外部文件时爆出了FileUriExposedException异常,刚开始以为是自己编写出错,但是调过几次之后发现不是,结合大神和官方文档终于整明白其原因所在。
1,Android 7.0 及其以上版本对系统进行了很多的优化:例如文件访问权限,省电,网络,后台等等,其中最突出的就是应用外的Uri访问。
什么时候会用到Uri的应用外访问呢?比如实现开发APP更新时,这个时候会调用系统功能来安装这个apk,这就是应用外访问文件,需要传入文件的Uri。
但是这样可能会显得不太安全,万一是什么非常重要的文件就糟糕了,所以Android 7.0及以上版本对应用外访问的Uri要进行处理加密。话不多说直接上代码。
2,又到了产品经理和同事对你惊讶的时刻了,一分钟解决FileUriExposedException异常:
首先在AndroidManifest文件中注册

<application
        android:allowBackup="true"
        android:icon="@drawable/logo"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <!--        //临时访问文件的注册-->
        //======================ctrl+c区域===================================
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.lipuwulian.blesample.provider"//自己包名加.provider
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
//======================ctrl+c区域===================================
        <activity android:name="com.lipuwulian.blesample.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

在res文件夹下创建xml文件夹、对应的位置

file_paths文件里的内容:path是data/包名加.testapplication/

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="files_root"
            path="Android/data/com.lipuwulian.blesample.testapplication/" />
        <external-path
            name="external_storage_root"
            path="." />
    </paths>
</resources>

配置完之后就把项目中的
File file = new File(path);
Uri.fromFile(file)或者Uri.parse(file)变成
FileProvider.getUriForFile(context.getApplicationContext(),
“com.lipuwulian.blesample.provider”, file);

如果想学习如何实现微信分享的话,可以去我的下一篇一分钟让你实现Android微信分享功能
到这里就结束了,希望能够帮到大家哦!IT需要爱与和平😊,最后请大家关注我,以及我的一分钟系列(Android篇和小程序篇)让你一分钟实现相应的功能,成功引起产品经理的注意袄。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值