半栈工程师Android收藏集

android 8.0下载Apk后,跳转安装页面失败解决方案

2018-06-25  本文已影响211人  火星局

前言

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"/>

效果图

image.png image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读