美文网首页
Anroid 8.0 允许下载安装未知应用来源完整逻辑处理 &a

Anroid 8.0 允许下载安装未知应用来源完整逻辑处理 &a

作者: thisfeng | 来源:发表于2018-03-15 20:52 被阅读197次

      在处理更新下载过程中在 8.0 遇到的问题,下载完毕更新包之后未跳转安装页面
      得知在 Android 8.0 中未知应用安装权限的开关默认是被关闭的 ,需要用户手动打开允许
    【未知来源应用权限】才能够安装。Google 对于Android 的安全可谓是越来越严格了。

    下面介绍如何处理

    1、在清单文件中增加请求安装权限

    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    

    2 、主要通过此方法判断是否已获取到安装权限

     haveInstallPermission = getPackageManager().canRequestPackageInstalls();
    

    如果 haveInstallPermission 为 true, 应用已经获取安装未知来源应用的权限,你可直接执行安装应用的相应逻辑。

    如果 haveInstallPermission 为 false,应用没有获取安装未知来源应用的权限,则无法安装应用。由于这个安装权限并不是运行时权限,所以无法再代码中请求权限,只能弹一个Dialog提示 ,告知用户需要安装权限,确认后 跳转到设置界面中去打开权限。

    3、未获取权限,需要手动前往「 该应用对应的设置页面 」该允许安装设置页面让用户手动去勾选

        // 注意这个是8.0新API需要判断
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Uri packageURI = Uri.parse("package:" + Context.getPackageName());
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
                startActivityForResult(intent, REQUEST_CODE_INSTALL_PERMISSION);
            }
    

    根据包名去进入本应用页面的设置,不传的话会将会进入所有的设置列表
    (tips:如果进入列表设置之后在onActivityResult返回的值中 resultCode == RESULT_OK 将返回false )

    完整逻辑处理:

        private static final int REQUEST_CODE_INSTALL_PERMISSION = 107;
      /**
         * 安装应用的流程  大于8.0需要用户手动打开未知来源安装权限
         * 需要在清单文件中加入权限  REQUEST_INSTALL_PACKAGES
         */
        private void installProcess() {
    
            boolean haveInstallPermission;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                haveInstallPermission = getPackageManager().canRequestPackageInstalls();
                if (!haveInstallPermission) {
                    //没有未知来源安装权限权限
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("提示");
                    builder.setMessage("安装应用需要打开未知来源权限,请去设置中开启应用权限,以允许安装来自此来源的应用");
                    builder.setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                startInstallPermissionSettingActivity();
                            }
                        }
                    });
                    builder.show();
                    return;//防止系统执行默认的方法会跳转页面后弹窗提示,所以会重复 return 掉
                }
            }
    
            installApk();
        }
    
       /**
         * 有权限,开始安装应用程序
         */
        private void installApk() {
            Intent intent = new Intent();
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setAction(Intent.ACTION_VIEW);
                              /*  intent.setDataAndType(Uri.fromFile(new File(getDownloadTempFileName())),
                                "application/vnd.android.package-archive");*/
            //适配Android 7.0 FileProvider文件访问,这里可能需要你修改成自己的访问方式
            FileProvider7.setIntentDataAndType(CompulsiveHelperActivity.this,
                    intent, "application/vnd.android.package-archive", new File(getDownloadTempFileName()), true);
            startActivity(intent);
        }
    
      @RequiresApi(api = Build.VERSION_CODES.O)
        private void startInstallPermissionSettingActivity() {
            //注意这个是8.0新API
            Uri packageURI = Uri.parse("package:" + getPackageName());
            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
            startActivityForResult(intent, REQUEST_CODE_INSTALL_PERMISSION);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_INSTALL_PERMISSION) {
                installProcess();//再次执行安装流程,包含权限判等
            }
        }
    

    Tips

    (1)、下载应用之前,必须遵守 6.0 运行时权限获取读写权限
    (2)、需要适配处理 7.0 文件访问需要通过 FileProvider 去获取。这里我使用的工具类是鸿洋提供的一种处理方式 FitAndroid7

    关于 Android 7.0 行为变更 通过FileProvider在应用间共享文件吧

    相关文章

      网友评论

          本文标题:Anroid 8.0 允许下载安装未知应用来源完整逻辑处理 &a

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