Android7.0适配SD卡权限

之前APP中有一个功能,版本更新下载新的APK文件之后,直接打开系统的安装页面。原来的代码如下:

private void install(File apkFile) {
        Uri uri = Uri.fromFile(apkFile);
        Intent localIntent = new Intent(Intent.ACTION_VIEW);
        localIntent.setDataAndType(uri, "application/vnd.android.package-archive");
        startActivity(localIntent);
    }

以上的代码在7.0一下正常执行,但是运行在7.0以上的设备就会闪退。而7.0的” StrictMode API 政策” 禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常。解决办法如下:

  1. 在res目录下新建一个xml文件夹,并创建一个名为provider_paths.xml的文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
            name="external_path"
            path="."/>
</paths>
  1. 在manifest文件的application标签下添加一个provider标签
<application>
  <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="包名.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true">
            <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths" />
        </provider>
    </application>

其中特别要注意android:authorities,需要使用包名.fileprovider的方式。 3. 修改install方法

public static void install(Context ctx, File apkfile) {
        if (apkfile == null) return;
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
            String authority = ctx.getPackageName() + ".fileprovider";
            Uri contentUri = FileProvider.getUriForFile(ctx, authority, apkfile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkfile), "application/vnd.android" +
                    ".package-archive");
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        ctx.startActivity(intent);
    }

要注意authority的值必须和provider标签中的android:authorities一模一样,否则会报错。 这样就解决了7.0上SD卡权限报错问题

转载于:https://my.oschina.net/simaben/blog/1845338

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值