Android 7.0/8.0 安装APK时解析包错误问题

在android7.0上

 private void installApk(File file) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        // 将此段代码移到此,可正常安装
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri apkUri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            apkUri = FileProvider.getUriForFile(mContext
                    , "项目包名.FileProvider"
                    , file);
        } else {
            apkUri = Uri.fromFile(file);
        }
       intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
       mContext.startActivity(intent);
    }

复制代码

这里要注意 :

  • setFlags():为intent 设置特殊的标志,会覆盖 intent 已经设置的所有标志。

  • addFlags():为intent 添加特殊的标志,不会覆盖,只会追加。

在Google8.0系统上在,遇到了上述方法无法解决的解析包出错问题,后改进代码为如下,解决问题

 private void installApk(File file) {
        try{
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            Uri apkUri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                apkUri = FileProvider.getUriForFile(mContext
                        , "项目包名.FileProvider"
                        , file);
            } else {
                apkUri = Uri.fromFile(file);
            }
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
            // 查询所有符合 intent 跳转目标应用类型的应用,注意此方法必须放置在 setDataAndType 方法之后
            List resolveLists = mContext.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
            // 然后全部授权
            for (ResolveInfo resolveInfo : resolveLists){
                String packageName = resolveInfo.activityInfo.packageName;
                mContext.grantUriPermission(packageName, apkUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            }
            mContext.startActivity(intent);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

复制代码

你可能感兴趣的:(Android 7.0/8.0 安装APK时解析包错误问题)