美文网首页Android好文收录Android开发经验谈安卓开发博客
Android O 8.0,版本升级不跳转应用安装页面的完美解决

Android O 8.0,版本升级不跳转应用安装页面的完美解决

作者: 一只懂音乐的码虫 | 来源:发表于2018-03-13 21:01 被阅读743次

    最近开发遇到了个问题,app升级的时候,其他手机都能正常升级,下载完安装包,跳到安装页面进行新版本的安装。但却有用户反映,华为P10和华为Mate 9升级时,怎么也无法跳转到安装页面。起初我以为是华为手机自身系统的问题(因为手上的华为测试机都是正常的),还特地对比了几种配置的华为手机,最后发现,是Android 8.0系统版本的锅,不是手机的问题。

    2017年8月22日,Google发布了Android 8.0的正式版,其正式名称为:Android Oreo(奥利奥),Android 8.0强化了权限管理,变得更加安全。在Android 8.0以前,所有的未知来源应用都可以被安装,或者会弹窗给用户一个提示,如此设计虽然方便,但是若被引诱安装了恶意软件,安装"未知来源"的应用有可能会对手机系统带来潜在的危害;

    而在Android 8.0的系统中,未知来源应用权限的开关被移除掉了,取而代之的是未知来源应用的管理列表,如果你想要安装某个被自己所信任的开发者的app,则需要在每一次都手动授权"安装未知应用"的许可。设置页面如下图:(在华为Android 8.0中,打开该设置页面:设置列表—>安全与隐私—>更多安全设置—>安装未知应用)

    3828835-5c25da54c93b55cc.png

    如图所示,若某个应用选择的是“不允许”,那么假设app手动升级的时候,就无法成功跳转到安装页面进行正常的App升级流程了,此时需要手动去授权才行,但是很多用户并不知道需要这么设置。
    废话说了一大堆,解决其实很简单。

    1.在AndroidManifest.xml文件中,添加REQUEST_INSTALL_PACKAGES权限
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    2.在打开安装包的代码中添加兼容Android 8.0的代码。

     /**
         * 打开安装包
         *
         * @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);
                }
            }
        }
    
        /**
         * 跳转到设置-允许安装未知来源-页面
         */
        @RequiresApi(api = Build.VERSION_CODES.O)
        private void startInstallPermissionSettingActivity() {
            //注意这个是8.0新API
            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mContext.startActivity(intent);
        }
    

    相关文章

      网友评论

      本文标题:Android O 8.0,版本升级不跳转应用安装页面的完美解决

      本文链接:https://www.haomeiwen.com/subject/dgdtqftx.html