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

news2024/12/29 11:34:04

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1597314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pdf预览空白问题解决。第一次预览正常,再重新打开就空白的问题。是因为cmaps没有更新

文章目录 问题描述问题解决问题总结曾经参考过的文章(也未能解决) 问题描述 我用的是pdfjs作为PDF预览工具使用。 预览有电子签章的PDF后(如下图的水印、签章),再重新预览没有电子签章的PDF,就会空白。 如上图,第一个…

【Linux】磁盘管理和文件系统

目录 一、硬盘 1.硬盘结构 2.结构类型 二、MBR与磁盘分区 1.MBR主引导记录 2.磁盘分区结构 三、文件系统类型 四、linux系统添加并使用新硬盘的步骤 1.添加新的硬盘 2.刷新识别 3.进行分区 4.格式化,创建文件系统 5.挂载使用 一、硬盘 1.硬盘结构…

什么是人力资源成本?人力资源成本有哪些?

人力资源成本是企业运营成本的重要组成部分,对企业的财务状况和经营效率有着直接影响,如今企业面临着持续的成本压力和效率挑战。人力资源成本不仅直接关联企业的运营效率,还影响着企业的长期战略发展。因此,如何优化人力资源成本…

二、变量和引用

目录 2.1 什么是变量 2.2变量的命名 2.3 变量的类型 2.3.1 根据数据类型分类 2.3.2 根据作用域分类 2.4 变量的定义 2.5 shell中的引用 在程序设计语言中,变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌握的一个非常基础的概念。只有理…

D3-八数码

D3-八数码 题目描述解题思路代码如下 题目描述 解题思路 本题若直接在3*3网格中思考较为困难,可以转换为一维的字符串,在一维字符串中考虑较为简单,要注意本题中两个字符交换位置时只能是x和另外字符交换,本题另外一个难点在于如何…

借力社交裂变,Xinstall助你实现用户快速增长

在数字化时代,社交裂变已成为品牌获取新用户、扩大影响力的关键手段。然而,如何有效利用社交裂变,实现用户快速增长,却是许多品牌面临的挑战。今天,我们将为大家介绍一个强大的社交裂变引擎——Xinstall,它…

Cesium 无人机航线规划

鉴于大疆司空平台和大疆无人机app高度绑定,导致很多东西没办法定制化。 从去年的时候就打算仿大疆开发一套完整的平台,包括无人机app以及仿司空2的管理平台,集航线规划、任务派发、实时图像、无人机管理等功能的平台。 当前阶段主要实现了&…

包装类初识泛型

一.包装类 在Java中, 基本类型不继承于Object类. 所以为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型.(包装类型相当于引用类型) 1.基本类型对应的包装类 byte -- Byteshort -- Shortint -- Integerlong -- Longfloat -- Floatdouble -- Doublech…

20V/3A大电流线性稳压器替代MIC29302/MIC29300

概述(替代MIC29302/MIC29300) PCD3942 是一款低压差稳压器,专为快速瞬态响应而优化。该装置能够提供 3A 的输出电流,典型压降为 325mV。工作静态电流为 1mA,关机时降至 1μA 以下,同时压差模式下静态电流控制良好。除了快速瞬态响…

lua学习笔记20(lua中一些自带库的学习)

print("*****************************lua中一些自带库的学习*******************************") print("*************时间***************") --系统时间 print(os.time()) --自己传入参数得到时间 print(os.time({year2011,month4,day5})) --os.data(&qu…

《HF经理》:二认知误区

一、管理者掌握重要权力: 二、全力来自管理者的职位: 三、管理者必须控制自己的直接下属: 对策:展示自己的品质,能力和影响力 四、管理者必须建立良好的个人关系: 五、管理这必须确保一切运行正常&…

深度学习框架

深度学习框架 1 引言 在当今技术加速发展的时代,深度学习已经成为了人工智能领域内最为引人注目的子领域之一。其在图像识别、自然语言处理、自动驾驶等多个行业中的成功应用,已经证明了深度学习在解决复杂问题方面的巨大潜力。然而,深度学习…

31、链表-K个一组反转链表

思路: 首先知道如何反转链表,其次找出每组的开始节点和结束节点,然后对于不足与k个的链表保持原状。 代码如下: class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (headnull||k1){return head;}ListN…

一个小小逻辑符的错误使用,资损几万块?

分享是最有效的学习方式。 博客:https://blog.ktdaddy.com/ 故事 这是一个真实事件,三年前老猫负责公司的支付资产业务。为了响应上级号召,加强国央企之间的合作,公司新谈了一个支付对接的渠道(当然这个支付渠道其实很…

IT精英的财富攻略:五大策略揭秘

IT精英的财富攻略:五大策略揭秘 💸 数字化浪潮汹涌,IT技能成为职场的金钥匙🔑,更为智慧的IT人打开了赚钱的大门。如果你身怀网络维护与安全管理的绝技,那么这五大策略,正是你蓄势待发的赚钱法宝…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Push Button的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 按钮类控件Push Button的使用及说明 文章编号&#xff1…

09 - 镜像管理之:部署单点harbor

本次准备了3台机器:harbor-01、harbor-02、harbor-db,用于测试 单点模式、高可用模式 部署 harbor。 ip主机名规格操作系统说明192.168.217.136harbor-012c4gCentos7.9harbor 服务器,测试单点harbor192.168.217.135harbor-022c4gCentos7.9ha…

快速探索随机树-RRT

文章目录 简介原理算法运动规划的变体和改进简介 快速探索随机树(RRT)是一种算法,旨在通过随机构建空间填充树来有效搜索非凸高维空间。该树是从搜索空间随机抽取的样本中逐步构建的,并且本质上偏向于向问题的大型未搜索区域生长。RRT 由 Steven M. LaValle 和 James J. K…

数据库SQL语言实战(一)

目录 创建SQL表 题目一 题目二 题目三 插入数据 题目一 题目二 题目三 总结 创建SQL表 题目一 创建学生信息表(学生编号、姓名、性别、年龄、出生日期、院系名称、班级): test1_student:sid char 12 not null、nam…

Unity Shader之数学篇

一、坐标系 1、二维笛卡尔坐标系 屏幕坐标系是二维笛卡尔坐标系,OpenGL的屏幕坐标系原点在左下角,DirectX的屏幕坐标系原点在左上角。 2、三维笛卡尔坐标系 三维笛卡尔坐标系要区分是左手坐标系还是右手坐标系。 左手坐标系:举起你的左手…