private void installApk(File file) {
Intent intent = new Intent(Intent.ACTION_VIEW);
// 将此段代码移到此,可正常安装
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
apkUri = FileProvider.getUriForFile(mContext
, "项目包名.FileProvider"
, file);
} else {
apkUri = Uri.fromFile(file);
}
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
mContext.startActivity(intent);
}
复制代码
这里要注意 :android
setFlags():为intent 设置特殊的标志,会覆盖 intent 已经设置的全部标志。bash
addFlags():为intent 添加特殊的标志,不会覆盖,只会追加。app
private void installApk(File file) {
try{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
apkUri = FileProvider.getUriForFile(mContext
, "项目包名.FileProvider"
, file);
} else {
apkUri = Uri.fromFile(file);
}
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
// 查询全部符合 intent 跳转目标应用类型的应用,注意此方法必须放置在 setDataAndType 方法以后
List<ResolveInfo> resolveLists = mContext.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
// 而后所有受权
for (ResolveInfo resolveInfo : resolveLists){
String packageName = resolveInfo.activityInfo.packageName;
mContext.grantUriPermission(packageName, apkUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
mContext.startActivity(intent);
}catch (Exception e){
e.printStackTrace();
}
}
复制代码