android 開發8.0intent安裝apk失敗螢幕閃過
阿新 • • 發佈:2019-02-19
由於之前寫好的一套 強制更新邏輯放到新專案上 有的手機正常,部分新手機拉不起來安裝頁面,排查原因,錯誤發生在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特殊處理 然後正常走就可以了,坑