记录Android7.0下载APK自动安装出错的问题
Android系统自从6.0部分权限需要去动态申请之后,Android在7.0在访问私有录被限制。
如果一项包含文件file:// URI类型 的 Intent 离开你的应用,则会报出异常。这项权限的变更将意味着你无法通过File API访问手机存储上的数据了,基于File API的一些文件浏览器等也将受到很大的影响.
即类似于这样的获取file的uri的Api在7.0版本之前都是可以正常使用的,但是在7.0之后的版本就不能在这样去实现了,只能通过FileProvider类去实现。
在Android8.0Oreo中,Google移除掉了容易被滥用的“允许位置来源”应用的开关,在安装第三方来源的应用的时候需要手动的去打开允许安装未知来源的开关。
适配代码:
这个是安装APK的代码:
Intent intent = new Intent(Intent.ACTION_VIEW);File file = new File(filePath);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID+".fileProvider", 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);
这个是8.0判断时候有安装第三方来源的代码判断:
boolean flag = context.getPackageManager().canRequestPackageInstalls();
如果flag = true的话即允许安装第三方来源的,否则则不允许。
另外FileProvider还要在AndroidManifest.xml添加:
<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>
这个file_paths文件要在res目录新建一个xml的文件夹
内容如下:
<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="office" path="." /></paths>
一切就都大功告成了。嘿嘿!!!
(友情提示一下:上面的BuildConfig是你自己项目下的BuildConfig,不要导错包哦,嘿嘿!!!)