1. 程式人生 > >android 開發8.0intent安裝apk失敗螢幕閃過

android 開發8.0intent安裝apk失敗螢幕閃過

由於之前寫好的一套 強制更新邏輯放到新專案上 有的手機正常,部分新手機拉不起來安裝頁面,排查原因,錯誤發生在android8.0系統以上,API 26 之後,所以對症下藥,解決問題

Android 8.0 Oreo 中,Google 移除掉了容易被濫用的“允許位置來源”應用的開關,在安裝 Play Store 之外的第三方來源的 Android 應用的時候,竟然沒有了“允許未知來源”的檢查框,如果你還是想要安裝某個被自己所信任的開發者的 app,則需要在每一次都手動授予“安裝未知應用”的許可。

所以我們又要掉坑了,又要開始做適配,就是android8.0要加一條許可權就是

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


這是安裝未知來源應用的許可權,只新增這一條許可權 測試了幾個手機可行,單式出於安全起見,還要提高健壯性

所以安裝時最好判斷一下

/**
 * 判斷是否是8.0,8.0需要處理未知應用來源許可權問題,否則直接安裝
 */
private void checkIsAndroidO() {
    if (Build.VERSION.SDK_INT >= 26) {
        boolean b = mContext.getPackageManager().canRequestPackageInstalls();
        if (b) {
            installApk();//安裝應用的邏輯(寫自己的就可以)
        } else {
            //請求安裝未知應用來源的許可權
            new RxPermissions((Activity) mContext).request(Manifest.permission.REQUEST_INSTALL_PACKAGES).subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean aBoolean) {
                    if (aBoolean) {
                        installApk();
                    } else {
                        TipsToast.showTips("請允許安裝應用");
                        //跳轉到授予安裝未知來源應用開關介面
                        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
                        mContext.startActivity(intent);
                    }
                }
            });
        }
    } else {
        installApk();
    }

}


/**
 * 安裝 apk 檔案
 */
private void installApk() {
    Intent installApkIntent = getInstallApkIntent();
    if (installApkIntent != null)
        mContext.startActivity(installApkIntent);
}

private Intent getInstallApkIntent() {
    File apkFile = new File(saveFileName);
    if (!apkFile.exists()) {
        return null;
    }
    Intent installApkIntent = new Intent();
    installApkIntent.setAction(Intent.ACTION_VIEW);
    installApkIntent.addCategory(Intent.CATEGORY_DEFAULT);
    installApkIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
        installApkIntent.setDataAndType(FileProvider.getUriForFile(mContext, ContextHelper.getApplication().getPackageName() + ".fileProvider", apkFile), "application/vnd.android.package-archive");
        installApkIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    } else {
        installApkIntent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
    }
    return installApkIntent;
}


判斷一下8.0特殊處理 然後正常走就可以了,坑