Android8.0适配安装未知来源应用

现在应用都有自动更新提示, 升级后自动安装, 但是8.0后谷歌需要添加安装未知来源应用权限,否则不会自动安装的,所以下面我们适配一下8.0, 有两种方法:

第一种方法

首先我们要在清单文件中添加请求权限

    <!-- 8.0安装apk权限 -->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

我们主要讲下载后安装的适配问题,下载apk的逻辑大家可以自行百度一下,或者可以直接评论需要下载源码,那我会打包发给你,当我们下载成功后

    public static final int INSTALL_PACKAGES_REQUESTCODE = 9999;

 /**
     * 请求权限 path apk下载成功后路径
     */
    public static void judgeApkPermissions(final Activity activity, String path){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        //请求安装权限
            boolean b = activity.getPackageManager().canRequestPackageInstalls();
            if (b) {
            //如果请求成功了,可以直接安装
                installAPk(activity, path);//安装应用的逻辑(写自己的就可以)
            } else {
                //请求安装未知应用来源的权限
                ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);
            }
        } else {
            installAPk(activity, path);
        }
    }
//安装apk
    public static void installAPk(Context context, String filePath) {
        if (!TextUtils.isEmpty(filePath)){
            File apkFile = new File(filePath);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            // 由于没有在Activity环境下启动Activity,设置下面的标签
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N) { //判读版本是否在7.0以上
                //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件
                Uri apkUri =  FileProvider.getUriForFile(context, HexCommonFileProvider.shareProvider().getFileProviderName(), apkFile);
                //添加这一句表示对目标应用临时授权该Uri所代表的文件
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
            }else{
                intent.setDataAndType(Uri.fromFile(apkFile),
                        "application/vnd.android.package-archive");
            }
            context.startActivity(intent);
        }
    }

然后我们在请求权限页面添加权限返回方法

protected static final int GET_UNKNOWN_APP_SOURCES = 9998;
    @Override
    protected void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case HexInstallApkUtils.INSTALL_PACKAGES_REQUESTCODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //当权限被允许后,直接开始安装
                    HexInstallApkUtils.installAPk(CourseMainActivity.this, filePath);
                } else {
                //当权限未被允许,弹出alert 提示用户需要
                    new HexSweetAlertDialog(CourseMainActivity.this, HexSweetAlertDialog.NORMAL_TYPE, true)
                            .setTitleText(getResources().getString(R.string.hex_update_tip))
                            .setConfirmText(getResources().getString(R.string.hex_update_open))
                            .setCancelText(getResources().getString(R.string.hex_update_cancel))
                            .setCancelClickListener(new HexSweetAlertDialog.OnSweetClickListener() {
                                @Override
                                public void onClick(HexSweetAlertDialog hexSweetAlertDialog) {
                                    hexSweetAlertDialog.dismiss();
                                }
                            })
                            .setConfirmClickListener(new HexSweetAlertDialog.OnSweetClickListener() {
                                @Override
                                public void onClick(HexSweetAlertDialog hexSweetAlertDialog) {
                                    hexSweetAlertDialog.dismiss();
                                    //BuildConfig 一定要是主项目的包名
                                    Uri packageURI = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
                                    //注意这个是8.0新API
                                    Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
                                    startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
                                }
                            }).show();
                }
                break;
        }
    }
  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case GET_UNKNOWN_APP_SOURCES:
                HexInstallApkUtils.judgeApkPermissions(CourseMainActivity.this, filePath);
                break;
        }
    }

如果请求安装权限通过的话,就直接开始安装了
如果没有通过的话,弹出alert,提示用户需要打开安装权限,如果用户允许后,就会出现下面页面
在这里插入图片描述
当用户将允许来自此来源应用开关打开后, 就开始直接安装

第二种方法

    public static boolean installApp(Activity activity, String filePath) {
        try {
            Intent intent = getInstallAppIntent(activity, filePath);
            if (intent != null && activity.getPackageManager().queryIntentActivities(intent, 0).size() > 0){
                activity.startActivity(intent);
            }
            return true;
        } catch (Exception e) {
            HexLog.e(e.getMessage());
        }
        return false;
    }

可以不用请求安装未知来源权限, 下载成功后直接调用该方法.就可以直接安装了,比第一种的方法要简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值