Android 踩坑记1---------Android8.0自动升级覆盖安装问题坑

最近发布版本测试发现部分手机无法升级安装问题,查询手机系统发现都是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新API
Intent 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系统通知创建坑

猜你喜欢

转载自blog.csdn.net/wanzhuanit/article/details/81330306