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);
    }

複製代碼

這裏要注意 :android

  • setFlags():爲intent 設置特殊的標誌,會覆蓋 intent 已經設置的全部標誌。bash

  • addFlags():爲intent 添加特殊的標誌,不會覆蓋,只會追加。app

在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<ResolveInfo> 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();
        }
    }

複製代碼
相關文章
相關標籤/搜索