最近发布版本测试发现部分手机无法升级安装问题,查询手机系统发现都是8.0+设备,后查看代码发现没有最8.0新特性适配,所以出现这种问题。
Android 8.0为了防止手机安装一些不安全软件,在安装非市场来源软件的时候需要请求安装未知应用来源的权限,故在安装软件之前需要用户允许此权限才可以进行安装。
具体操作如下:
1、首先在Mainfest文件中添加该权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
2、在需要升级下载软件前判断版本是否是8.0或8.0+,如果不是则执行自己之前正常下载逻辑,如果是则需要判断是否允许安apk
getPackageManager().canRequestPackageInstalls()
如果没有允许则需要去申请这个权限,这里要注意,网上有蛮多文章介绍使用
ActivityCompat.requestPermissions((Activity) context, new String[]{android.Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);
经测试这个方法在调用的时候没有弹出申请权限提示框,原因不明,所以考虑使用让用户手动去设置权限的方法去请求
Uri packageURI = Uri.parse("package:" + getPackageName());//直接跳转到自己的app页,如果不加会跳转到应用列表页
//注意这个是8.0新APIIntent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
用户设置完之后在onActivityResult方法中根据自己设置的code去做逻辑处理,我这里使用的是GET_UNKNOWN_APP_SOURCES
完整代码如下
/**
* 需要判断是否是Android8.0版本
*/
private void checkIsAndroidO() {
if (Build.VERSION.SDK_INT >= 26) {
boolean b = MkzApplication.getInstance().getPackageManager().canRequestPackageInstalls();
if (b) {
dialog.doUpdate();//安装应用的逻辑(写自己的就可以)
} else {
//请求安装未知应用来源的权限,这里加了弹框提示
MkzDialogUtils.showDialogWithBtn(SettingActivity.this, "", "安装应用需要打开未知来源权限,请去设置中开启权限", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri packageURI = Uri.parse("package:" + getPackageName());
//注意这个是8.0新API
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
}
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
}
} else {
dialog.doUpdate();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GET_UNKNOWN_APP_SOURCES && resultCode == Activity.RESULT_OK){
checkIsAndroidO();
}
}
至此权限申请就完成了
下载逻辑按照自己的处理,如果你的下载逻辑中有通知栏,你会发现通知栏没有弹出来,因为8.0还是要继续进行适配,具体方案移步至我的下一篇文章 Android 踩坑记2---------Android8.0系统通知创建坑
网友评论