前言
8.0操作系统在android 市场中的比重逐步提高。在一次项目测试版本更新时,发现8.0的系统,在apk下载成功后直接闪退,无法跳转到安装页面。资料一通查,发现谷歌在API 26以后对“未知应用”的安装权限关闭,需要手动打开。国内android系统手机厂商众多,“未知应用”安装权限的开关位置略有差别。这里以 vivo x9Plus为例:设置->更多设置->权限管理->权限->安装应用,点击进入找到你的应用,把开关打开即可。
上面的方法固然可行,但让每个8.0系统的用户第一次版本升级时都手动打开这个权限是非常不友好滴,这也太不符合我们程序员的性格了。
背景
维护的一个老项目,App版本升级的逻辑是之前的同事封装起来放在了github上引用过来的,领导又催了很急。索性直接在项目中修改,功能实现了,但感觉很乱,一个版本升级功能,代码写的到处都是。
实现思路
在检查服务器上有新版时,如果操作系统在8.0以上(包括8.0),直接判断是否拥有此权限;没有权限,弹出对话框提示用户去打开次权限,再次判断是否拥有权限;拥有权限下载apk安装。此权限每个App设置只需要设置一次,除非App卸载在安装
伪代码
// 有新版本时,判断系统为8.0以下直接下载apk,8.0以上(包含8.0)弹出提示框,提示用户设置权限,
@Override
public void checkPermissions(boolean isFromMain, String url) {
if (isFromMain) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = mainView.getAct().getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
mainView.addDownApkDialog(url);
} else {
mainView.downApk(url);
}
} else {
mainView.downApk(url);
}
}
}
// 提示设置权限对话框 ,根据选择项,是否跳转到权限设置页面
@Override
public void addDownApkDialog(String url) {
downApkUrl = url;
dialogUtil.SweetSettingAlertDialog(this, Config.downApkDialogTitle, Config.downApkDialogMsg, Config.downApkDialogOkBtn, Config.downApkDialogNoBtn, new DialogListener.OnSweetAlertListener() {
@Override
public void onSure(SweetAlertDialog dialog) {
dialog.dismiss();
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
startActivityForResult(intent, 1);
}
@Override
public void onNo() {
toast(MainAct.this, Config.downApkDismissDialogMsg);
}
});
}
// 设置权限后,开始下载 ,注意:跳转到权限页面返回到App时,需再检查一次是否拥有权限
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
meCenterPresenter.checkPermissions(true, downApkUrl);
}
}
// 系统在8.0以下或者8.0以上并拥有权限时,开始下载
@Override
public void downApk(String url) {
final ProgressDialog progressDialog = dialogUtil.showProgress(MainAct.this);
XUtils.create().retrofitDown(MainAct.this, url, Config.Path_Apk,
new OnRetrofit.OnDownLoadListener() {
@Override
public void onSuccess(int i, int i1) {
progressDialog.setProgress(i);
if (i == 100) {
progressDialog.dismiss();
}
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void hasDown(String s) {
progressDialog.dismiss();
meCenterPresenter.installApkView(MainAct.this, s);
}
});
}
清单文件权限配置
<!--8.0 安装权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
效果图
-
运行的设备 8.0系统
image.png
-
发现新版本
image.png
-
点击确定,判断是否有权限
![](https://img.haomeiwen.com/i5915124/2b9aad104d1b42c0.png)
- 1.“去设置”,跳转设置页面,点击你的应用,设置权限
![](https://img.haomeiwen.com/i5915124/020135488a584a79.png)
![](https://img.haomeiwen.com/i5915124/129e4d0254bfa001.png)
-
1.1拥有权限,开始下载
image.png
-
1.2 下载成功后安装
image.png
-
2.“拒绝”,再次提示用户
image.png
网友评论