Android11应用安装未知来源的权限改动

最近开发的App需要下载安装另一个App。这就涉及到了app的安装代码。关于App的安装代码,写了不少,所以这一块觉得不是问题:

判断版本,Android8.0判断是否有未知来源安装全选,没有则打开未知来源安装权限设置界面去开启。去设置未知来源前,先缓存以下当前等待安装的apk文件路径

java 复制代码
   public void installApkProcess(File apkFile) {
        if (Build.VERSION.SDK_INT >= 26) {
            boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
            if (!hasInstallPermission) {//没有安装未知来源的权限
                startInstallPermissionSettingActivity();
                //去设置之前,先暂存一下安装包,等设置完,载安装
                CommonTemp.getInstance().setWaitingForInstallPermissionSettingApkFile(apkFile);
                return;
            }
        }
        installApk(apkFile);
    }

打开位置来源权限设置界面

java 复制代码
 private void startInstallPermissionSettingActivity() {
        Uri packageURI = Uri.parse("package:" + mContext.getPackageName());
        //注意这个是8.0新API
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
        Activity activity = AppManager.getAppManager().getTopActivity();
        activity.startActivityForResult(intent, 6000);
    }

App安装的代码

java 复制代码
public void installApk(File apkFile) {
        if (apkFile == null || !apkFile.exists()) {
            return;
        }
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//Android7.0
            Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", apkFile);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            // 通过Intent安装APK文件
            intent.setDataAndType(Uri.parse("file://" + apkFile.toString()),
                    "application/vnd.android.package-archive");
        }
        if (mContext.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
            mContext.startActivity(intent);
            //安装完,清除缓存
            CommonTemp.getInstance().setWaitingForInstallPermissionSettingApkFile(null);
        }
    }

onActivityResult种监听开启了未知来源安装权限,此时继续执行安装apk

java 复制代码
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
       if (6000 == requestCode && resultCode == RESULT_OK) {//安装未知来源权限设置完成
            //权限设置完成,应该再次安装
            installApk(CommonTemp.getInstance().getWaitingForInstallPermissionSettingApkFile());
        }
    }

然而,当我在Android11的设备上运行时候,程序却发生了崩溃,原因是我打开未知来源安装设置界面后,开通权限之后,我本地刚刚缓存的apk文件名称变成空了......,有些地方没有判空导致程序崩溃了。不应该呀,平白无故为啥我的缓存变成空了?看了下日志,发现我的App进程结束后又重启了,这样本地的一些单例之类的缓存就是被清空了.......

网上百度查资料得出结论:

  • Android 11开始,Google默认情况下允许安装未知来源应用程序,只是在安装应用程序时候会给出一些警告。
  • 如果我们代码还是去打开未知来源安装的界面,点击开启未知来源安装权限后,应用程序会被结束并重启,

解决方案,在打开未知来源安装设置界面之前,需要判断下当前Android版本,如果是11或11以上,就直接安装。

所以,此处还是需要注意下,避免自己的应用程序出现不必要的bug。关于apk安装Android11之前的问题,我之前发了一篇文章Android7.0、8.0安装apk以及安装apk弹出"选择打开方式"的解决方案_手机安装apk显示用其他应用打开-CSDN博客

相关推荐
拭心2 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
带电的小王4 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡4 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道5 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库6 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道6 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe6 小时前
Android Hook - 动态加载so库
android
居居飒7 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He10 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗10 小时前
Android笔试面试题AI答之Android基础(1)
android