美文网首页半栈工程师Android收藏集
android 8.0下载Apk后,跳转安装页面失败解决方案

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

作者: 火星局 | 来源:发表于2018-06-25 16:32 被阅读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"/>
    

    效果图

    • 运行的设备 8.0系统


      image.png
    • 发现新版本


      image.png
    • 点击确定,判断是否有权限

    image.png
    • 1.“去设置”,跳转设置页面,点击你的应用,设置权限
    image.png
    image.png
    • 1.1拥有权限,开始下载


      image.png
    • 1.2 下载成功后安装


      image.png
    • 2.“拒绝”,再次提示用户


      image.png

    相关文章

      网友评论

      本文标题:android 8.0下载Apk后,跳转安装页面失败解决方案

      本文链接:https://www.haomeiwen.com/subject/ioyyyftx.html