从Android8.0以上开始,软件的升级又多了一个坑,权限管理更加严格了,一个不小心就升级失败。具体的解决方案如下:
/**
* 打开安装包
*
* @param fileUri
*/
public void openAPKFile(String fileUri) {
// 核心是下面几句代码
if (null != fileUri) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
File apkFile = new File(fileUri);
//兼容7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(getApplicationContext(), this.getPackageName() + ".fileProvider", apkFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
//兼容8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = this.getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
ToastUtils.showToast(this, "安装app需要您勾选允许安装未知应用权限");
startInstallPermissionSettingActivity();
return;
}
}
} else {
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
if (this.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
startActivity(intent);
}
} catch (Throwable e) {
e.printStackTrace();
ToastUtils.showToast(this, "未知应用权限开启失败,请重启应用");
}
}
}
/**
* 跳转到设置-允许安装未知来源-页面
*/
@RequiresApi(api = Build.VERSION_CODES.O)
public void startInstallPermissionSettingActivity() {
//注意这个是8.0新API
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, 99);
}
在申请权限的界面实现如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 99 ) {
if (resultCode ==RESULT_OK) {
openAPKFile(filepath);
} else if (resultCode ==RESULT_CANCELED) {
// 没有拿到权限,申请权限
ToastUtils.showToast(getApplicationContext(), "安装app需要您勾选允许安装未知应用权限");
}
}
}