1.由于安卓8.0对权限做了严格控制,导致在升级的时候回遇到各种奇葩的问题,下面记录一下在开发过程中遇到的坑
2.首先安装权限需要在manifest添加
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
3.看了好多文章都说在界面启动时对上述权限进行权限请求,我觉得没啥必要,即时请求了,也不会弹出权限提示对话框,所以说还不如直接在没有安装权限的时候让用户手动打开该权限比较好
4.下面是核心代码,在用户点击下载最新安装包时做一下是否有安装权限的判断
public void judgePermission() {
if (Build.VERSION.SDK_INT >= 26) {//如果大于等于8.0系统
if (getPackageManager().canRequestPackageInstalls()) {//判断是否有安装权限 true有 false 没有
showDownloadDialog();//有权限调用下载安装代码
} else {//没权限调到设置界面,这里有必要谈一个对话框提醒下用户
showMissingPermissionDialog();
}
}
}
5.提醒对话框,可以自定义
// 显示缺失权限提示
private void showMissingPermissionDialog() {
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(LaucherActivity.this);
builder.setTitle("帮助");
builder.setMessage(R.string.help1);
// 拒绝, 退出应用
builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,packageURI);//跳转权限设置界面
startActivityForResult(intent, 10000);//注意这个requestcode建议写大一点值,避免与其他请求码冲突
}
});
builder.show();
}
}
6.在onActivityResult调用用户对权限操作结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == 10000) {
// installApk();
showDownloadDialog();//用户打开了权限调用下载安装代码
}
}
7.还有可能提示此系统已存在最高版本,无法安装
(1)查看升级包与线上包签名是否一致
(2)是否使用同一签名工具,比如,线上用使eclise签名或360签名,升级包采用AS签名也有有可能出现此问题