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

Android11应用安装未知来源的权限改动文章讲述了在开发 App 时处理不同 Android 版本 特别是 8 0 和 11 的安装代码 强调了在 Android11 中打开未知来源权限设置后可能导致的应用程序重启和缓存清空问题 以及相应的解决方案

大家好,欢迎来到IT知识分享网。

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

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

 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); }

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

 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安装的代码

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

 @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进程结束后又重启了,这样本地的一些单例之类的缓存就是被清空了…….

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

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

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

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

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

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/124990.html

(0)
上一篇 2025-10-01 17:33
下一篇 2025-10-01 17:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信