Android7.0后版本升级问题

Android7.0后版本升级问题

问题描述:android7.0系统及以上,通过隐形intent调用系统安装apk的方式进行版本升级失败。
原方法

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
context.startActivity(intent);

问题原因:
android7.0采用strictmode api模式,禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常。

**解决方法:**使用FileProvider

  • 修改manifest文件
 <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/file_paths" />
</provider>

exported:要求必须为false,为true则会报安全异常。
grantUriPermissions:true,表示授予 URI 临时访问权限。
authorities 组件标识,按照江湖规矩,都以包名开头,避免和其它应用发生冲突。

  • 新增file_paths文件
    在res下新建xml---->file_paths
<?xml version="1.0" encoding="utf-8"?>
<resources>
   <paths>
       <external-path path="" name="download"/>
   </paths>
</resources>

代表的根目录: Context.getFilesDir()
代表的根目录: Environment.getExternalStorageDirectory()
代表的根目录: getCacheDir()

path="",它代码根目录,如果path设为path=“download”,那么它代表着根目录下的download目录(/storage/emulated/0/download)

  • 使用FileProvider获取文件URI
if (Build.VERSION.SDK_INT >= 24) {//判读版本是否在7.0以上
     Uri apkUri = FileProvider.getUriForFile(this, "manifest中定义的", file);//在AndroidManifest中的android:authorities值
     Intent install = new Intent(Intent.ACTION_VIEW);
     install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
     install.setDataAndType(apkUri, "application/vnd.android.package-archive");
     startActivity(install);
 } else {
     Intent intent = new Intent(Intent.ACTION_VIEW);
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     intent.setDataAndType(Uri.fromFile(file),
             "application/vnd.android.package-archive");
     context.startActivity(intent);
 }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值