在Android 8.0以上系统的手机上,会发现有部份手机,app下载完毕之后但是安装不上,也就是下载完毕之后,闪退。这个问题在8.0系统的手机上不是必现的,这可能和手机厂商的系统处理有关,但是有一点是确定的:Google从Android8.0系统开始,关闭了未知应用安装权限,需要用户手动点开。
第一步:当APK下载完毕之后,正常来说要跳转到APK安装页面,但是8.0系统需要做一个判断:是否用户开启了应用安装权限。
// 兼容Android 8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//先获取是否有安装未知来源应用的权限
boolean haveInstallPermission = context.getPackageManager().canRequestPackageInstalls();
if (!haveInstallPermission) {//没有权限
//TODO 去开启权限
} else {
//TODO 安装APK
}
} else {
//TODO 安装APK
}
第二步:如果没有就跳转到安装权限列表,然后从列表中找到我们的项目APP,跳转到我们的APP的设置安装权限页面:
@RequiresApi(api = Build.VERSION_CODES.O)
private void startInstallPermissionSettingActivity() {
Uri packageURI = Uri.parse("package:" + getPackageName());
//注意这个是8.0新API
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, UNKNOW_APP_SOURCE_CODE);
}
需要注意的是上面的getPackgeName() 这个一定要加。应为这句话就是表明直接跳转到我们APP的设置安装权限页面(不加的话,是跳转到APP设置权限列表页面)。
UNKNOW_APP_SOURCE_CODE,这个变量就是开发者自己定义的了。
第三步:在onActivityResult方法中,接受到是否获取权限成功,如果成功就跳转到直接安装APK。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == UNKNOW_APP_SOURCE_CODE && resultCode == RESULT_OK) {
//TODO 安装APK
}
}