Android O 8.0,版本升級(jí)不跳轉(zhuǎn)應(yīng)用安裝頁(yè)面的完美解決

最近開(kāi)發(fā)遇到了個(gè)問(wèn)題,app升級(jí)的時(shí)候,其他手機(jī)都能正常升級(jí),下載完安裝包,跳到安裝頁(yè)面進(jìn)行新版本的安裝。但卻有用戶反映,華為P10和華為Mate 9升級(jí)時(shí),怎么也無(wú)法跳轉(zhuǎn)到安裝頁(yè)面。起初我以為是華為手機(jī)自身系統(tǒng)的問(wèn)題(因?yàn)槭稚系娜A為測(cè)試機(jī)都是正常的),還特地對(duì)比了幾種配置的華為手機(jī),最后發(fā)現(xiàn),是Android 8.0系統(tǒng)版本的鍋,不是手機(jī)的問(wèn)題。

2017年8月22日,Google發(fā)布了Android 8.0的正式版,其正式名稱為:Android Oreo(奧利奧),Android 8.0強(qiáng)化了權(quán)限管理,變得更加安全。在Android 8.0以前,所有的未知來(lái)源應(yīng)用都可以被安裝,或者會(huì)彈窗給用戶一個(gè)提示,如此設(shè)計(jì)雖然方便,但是若被引誘安裝了惡意軟件,安裝"未知來(lái)源"的應(yīng)用有可能會(huì)對(duì)手機(jī)系統(tǒng)帶來(lái)潛在的危害;

而在Android 8.0的系統(tǒng)中,未知來(lái)源應(yīng)用權(quán)限的開(kāi)關(guān)被移除掉了,取而代之的是未知來(lái)源應(yīng)用的管理列表,如果你想要安裝某個(gè)被自己所信任的開(kāi)發(fā)者的app,則需要在每一次都手動(dòng)授權(quán)"安裝未知應(yīng)用"的許可。設(shè)置頁(yè)面如下圖:(在華為Android 8.0中,打開(kāi)該設(shè)置頁(yè)面:設(shè)置列表—>安全與隱私—>更多安全設(shè)置—>安裝未知應(yīng)用)

3828835-5c25da54c93b55cc.png

如圖所示,若某個(gè)應(yīng)用選擇的是“不允許”,那么假設(shè)app手動(dòng)升級(jí)的時(shí)候,就無(wú)法成功跳轉(zhuǎn)到安裝頁(yè)面進(jìn)行正常的App升級(jí)流程了,此時(shí)需要手動(dòng)去授權(quán)才行,但是很多用戶并不知道需要這么設(shè)置。
廢話說(shuō)了一大堆,解決其實(shí)很簡(jiǎn)單。

1.在AndroidManifest.xml文件中,添加REQUEST_INSTALL_PACKAGES權(quán)限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
2.在打開(kāi)安裝包的代碼中添加兼容Android 8.0的代碼。

 /**
     * 打開(kāi)安裝包
     *
     * @param mContext
     * @param fileUri
     */
    public void openAPKFile(Activity mContext, String fileUri) {
        DataEmbeddingUtil.dataEmbeddingAPPUpdate(fileUri);
        // 核心是下面幾句代碼
        if (null != fileUri) {
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                File apkFile = new File(fileUri);
                //兼容7.0
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileProvider", apkFile);
                    intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
                    //兼容8.0
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
                        if (!hasInstallPermission) {
                            ToastUtil.makeText(MyApplication.getContext(), MyApplication.getContext().getString(R.string.string_install_unknow_apk_note), false);
                            startInstallPermissionSettingActivity();
                            return;
                        }
                    }
                } else {
                    intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }
                if (mContext.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
                    mContext.startActivity(intent);
                }
            } catch (Throwable e) {
                e.printStackTrace();
                DataEmbeddingUtil.dataEmbeddingAPPUpdate(e.toString());
                CommonUtils.makeEventToast(MyApplication.getContext(), MyApplication.getContext().getString(R.string.download_hint), false);
            }
        }
    }

    /**
     * 跳轉(zhuǎn)到設(shè)置-允許安裝未知來(lái)源-頁(yè)面
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void startInstallPermissionSettingActivity() {
        //注意這個(gè)是8.0新API
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }
最后,附上我的一個(gè)Kotlin編寫(xiě)+組件化開(kāi)發(fā)的開(kāi)源項(xiàng)目Designer

Kotlin+組件化開(kāi)發(fā)實(shí)踐—開(kāi)源項(xiàng)目Designer-App

Designer項(xiàng)目算是傾注了我蠻多心血了,每個(gè)頁(yè)面和功能都當(dāng)成是上線的App來(lái)做,App的logo還特地做了UI設(shè)計(jì)??力求做到精致和完善,其中還包括了很多自己項(xiàng)目開(kāi)發(fā)中的經(jīng)驗(yàn)匯總和對(duì)新技術(shù)的探索和整合,希望對(duì)各位讀者有所幫助,歡迎點(diǎn)個(gè)star,follow,或者給個(gè)小心心,嘻嘻??也可以分享給你更多的朋友一起學(xué)習(xí),您的支持是我不斷前進(jìn)的動(dòng)力。如果有任何問(wèn)題,歡迎在GitHub上給我提issue或者留言。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容