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博客

相关推荐
檀越剑指大厂3 小时前
容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
android
MiyamuraMiyako4 小时前
从 0 到发布:Gradle 插件双平台(MavenCentral + Plugin Portal)发布记录与避坑
android
NRatel4 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
叽哥7 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走7 小时前
创建自定义语音录制View
android·前端
用户2018792831677 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831677 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker9 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong9 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil10 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin