安卓7.0 Uri.fromFile(file)报错随笔

android.os.FileUriExposedException:

1.前段时间,项目刚刚上线,然后,大家懂得--各种7.0崩溃

2.然后这个问题搞定了,下一个项目的时候7.0这个问题对吧,肯定得解决。然后复制,粘贴。 砰....崩溃


下面是我自己解决这两个问题的方法,分享给大家(百度上面也有,我自己想自己遇到的还是得积累积累)

报错原因:android7.0对于系统权限作了一些更改,为了提高私有文件的安全性,当我们在访问文件的时候,安卓禁止您的应用外部公开file://uri 

解决思路:需要在应用之间共享文件,那就少不了FileProvider类


第一步 在清单文件下注册

<provider
    android:name="android.support.v4.content.FileProvider"

    //此处的provider需要和代码中的provider保持一致
    android:authorities="你的包名.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>


 
第二步 res/xml/provider_paths类
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="" />

    <external-path
        name="files_root"
        path="Android/data/你的包名/download/"/>
</paths>
(第一个path是我用来解决7.0权限的,第二个是用于更新的)
第三步 在代码中将Uri.fromFile替换
if (Build.VERSION.SDK_INT >= 24) {
    uri = FileProvider.getUriForFile(this,"你的包名.provider", file);
} else {
    uri = Uri.fromFile(file);
}
更新部分
private void installApk(Context context, File file) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        Uri contentUri = FileProvider.getUriForFile(getApplicationContext(), "packagename.provider", file);
        intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
    } else {
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
    }
    context.startActivity(intent);
}

就是这么简单哈,但是注意几个问题
1 provider需要保证它的唯一性,即在不同的app里面需要使用不同的名称建议项目名+provider
2 如果你两个项目使用了同一个provider,真机上根本无法装载哦
3 注意你的代码里面的provider名字需要和清单的provider名字一致,否则会报空







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值