偶然遇到了用intent的安装apk的现象 随手查了下 在此记录下
/**
* 安装apk
*
* @param context
* @param apkPath
*/
public static void installApk(Context context, String apkPath) {
try {
/**
* provider
* 处理android 7.0 及以上系统安装异常问题
*/
File file = new File(apkPath);
Intent install = new Intent();
install.setAction(Intent.ACTION_VIEW);
install.addCategory(Intent.CATEGORY_DEFAULT);
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri apkUri = FileProvider.getUriForFile(context, "com.xxx.fileprovider", file);//在AndroidManifest中的android:authorities值
install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
install.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
}
context.startActivity(install);
} catch (Exception e) {
Toast.makeText(context, "文件解析失败", Toast.LENGTH_SHORT).show();
}
}
大致流程是先判断版本号根据不同版本号做不同处理 因为 Android 7.0 或更高版本的应用私有目录被限制访问 (0700)。此设置可防止私有文件的元数据泄漏,如它们的大小或存在性.
尝试传递 file:// URI 会触发 FileUriExposedException。所以分享私有文件内容的推荐方法是使用 FileProvider。
android:authorities=“com.xxx.fileprovider” 此处的authorities是你的包名.fileprovider
还有点需要注意 Android8.0、9.0需要请求未知来源应用安装权限
...
标签下面必须包含至少包含以下标签中的一个或者多个。
files-path 表示应用程序内部存储区中的文件/子目录中的文件
cache-path 表示应用程序内部存储区缓存子目录中的文件
external-path 表示外部存储区根目录中的文件
external-files-path 表示应用程序外部存储区根目录中的文件
external-cache-path 表示应用程序外部缓存区根目录中的文件
参考
[1]: http://www.czhzero.com/2016/12/21/how-to-install-apk-on-Android7-0/
[2]: http://www.jianshu.com/p/b566fa29a76e