最近在做 APP 的升级功能,需要在 apk 文件下载下来之后安装,我本以为是个很简单的功能,直接调用系统的接口就完事了,没想到还是有不少坑的。
Android 6.0 版本的安装
这个最常规,在6.0版本及之前版本都是通用的。
/** * 安装apk * * @param */ public static void install(Context mContext, File file) { Intent install = new Intent(Intent.ACTION_VIEW); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); mContext.startActivity(install); }
Android 7.0 版本的安装
上面的代码在 Android 7.0 及以上版本安装 apk 则会遇到 android.os.FileUriExposedException 问题。官方给出的解释是:
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
解决方案如下:
1.在AndroidManifest.xml 中添加如下代码:
注意
authorities:你app的包名.fileProvider grantUriPermissions:必须是true,表示授予 URI 临时访问权限 exported:必须是false resource:中的@xml/file_paths是我们接下来要添加的文件
还有额外的坑☠\ufe0f
我在使用过程中添加以上 provider 代码之后,遇到了 manifest 合并冲突问题:
Error:Execution failed for task ':app:processDebugManifest'. >