【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决

一般安卓提取apk图标我们有两种常用方法:

1、如果已经获取到 ApplicationInfo 对象(假设名为 appInfo),那么我们获取方法为:

appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象

2、 如果还没获取到 ApplicationInfo 对象,我们一般会先获取 packageInfo 对象,然后通过它来获取 ApplicationInfo 对象,

但是这个方法会存在一个 bug ,就是需要设置 sourceDir 、publicSourceDir 两个源路径属性之后才能正常获取到图标。

然后设置上面两个属性之后,如果设置图标之后,相同包名,但是图标不相同的,就会导致后续获取的图标都相同,也就是说,包名相同图标不同,但是获取到的图标竟然都相同!

初步分析,原因应该出现在包名、两个源路径身上。
这应该是 Android SDK 自己写 loadIcon 代码的时候也没考虑过的使用情况。
可能是包名作为类似 Key 之类的,然后通过包名找到源路径,然后通过源路径获取图标。
所以如果获取一次之后,只设置源路径而不修改包名,那么获取的将是旧的源路径对应的图标。

在这里插入图片描述

为了解决这个问题,以下是我改良之后的 Kotlin 代码

fun getAppIconFromApkPath(context: Context, apkFilePath: String): Drawable? {// 1. 获取 包管理器,并通过包管理器、apk 路径获取 packageInfo val packageManager: PackageManager = context.packageManagerval packageInfo = packageManager.getPackageArchiveInfo(apkFilePath,0//PackageManager.GET_ACTIVITIES//GET_META_DATA)// 2. 访问、修改 packageInfo 对象的 applicationInfo 对象里面一些属性,比如packageName、sourceDir、publicSourceDir、loadIconpackageInfo?.applicationInfo?.apply {// 2.1. 【关键步骤】设置 包名val oldPackageName = packageName// 保存旧的包名,因为下面获取 apk 图标之后要恢复packageName = apkFilePath// 将其包名改成一个任意的、唯一的其他字符串,这样获取到的图标才不会冲突// 2.2. 【必须步骤】设置源路径:设置sourceDir和publicSourceDir属性为APK文件的路径。这样可以确保加载的是APK文件中的资源,而不是系统资源。sourceDir = apkFilePathpublicSourceDir = apkFilePath// 设置这两个路径之后,同时也会把相关包名的文件设置。所以会导致已安装的和其他文件图标不一样!!!// 2.3. 通过 loadIcon 来获取 apk 图标val icon = loadIcon(packageManager)// 2.4. 【关键步骤】获取到图标之后,先恢复前面修改的包名、源路径,最后才能返回图标packageName = oldPackageName// 恢复成原来的包名(修改之前的)sourceDir = null// 并且把其他的数据还原为nullpublicSourceDir = null// 2.5. 最后返回获取到的图标return icon}return null
}

注意:以上只是个人测试代码,不保证没有其他结果。其他情况请自行测试!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

必背!!2024年软考中级——网络工程师考前冲刺几页纸

距离软考考试的时间越来越近了,趁着这两周赶紧准备起来 今天给大家整理了——软考网络工程师考前冲刺几页纸,都是核心重点,有PDF版,可打印下来,每天背一点。 计算机总线分类 ①总线的分类:数据总线、地址总…

内网渗透瑞士军刀-impacket工具解析(二)

impacket工具解析之Kerberos认证协议 上一期我们介绍了impacket中ntlm协议的实现,在Windows认证中除了使用ntlm认证,还支持Kerberos认证协议,Kerberos认证也是Windows 活动目录中占比最高的认证方式。 什么是Kerberos协议? Kerb…

CSRF 攻击实验:更改请求方式绕过验证

前言 CSRF(Cross-Site Request Forgery),也称为XSRF,是一种安全漏洞,攻击者通过欺骗用户在受信任网站上执行非自愿的操作,以实现未经授权的请求。 CSRF攻击利用了网站对用户提交的请求缺乏充分验证和防范…

英语学习笔记10——Look at ...

Look at … 看…… 词汇 Vocabulary fat adj. 胖的,丰富的 n. 脂肪 例句:他是个胖男孩。    He is a fat boy. 搭配:fat cat 有钱人,土豪 woman n. 女人 girl n. 女孩 madam n. 女士 man n. 男人 boy n. 男孩 sir n. 先生 …

jdk安装多个版本,但是java -version显示最早安装的版本,换掉Path或者JAVA_HOME不生效问题

问题一:当你的电脑上又多个jdk版本,如17 或者8时,使用命令行 java -version显示最早安装的,如下图所示:环境变量配置的17,但是命令行显示的是8。 原因:windows电脑装jdk17后 会在你的环境变量…

声纹识别在无人机探测上的应用

无人机在民用和军事领域的应用越来越广泛。然而,随着无人机数量的增加,"黑飞"现象也日益严重,对公共安全和隐私构成了威胁。因此,开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…

Springboot+Vue项目-基于Java+MySQL的民族婚纱预定系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

在浏览器执行js脚本的两种方式

fetch请求get 在浏览器执行http请求,可以使用fetch函数; fetch(“url”).then(response => response.text()) .then(data => console.log(JSON.parse(data)[‘status’])) .catch(error => console.error(error)) 直接返回json数据: fetch(“url”).then(response…

【Java】/*数组的定义与使用*/

目录 一、数组的定义 1.1 为什么要使用数组 1.2 什么是数组 1.3 数组的初始化 1.3.1 动态初始化 1.3.2 静态初始化 1.2.3 注意事项 三、遍历数组 3.1 用循环的方式遍历数组 3.2 用 for each 的方式遍历数组 3.3 用 Arrays.toString 的方式遍历数组 3.4 一些其他的…

【3dmax笔记】028:倒角的使用方法

一、倒角描述 在3dmax中创建倒角效果可以通过多种方法实现,以下是几种常见的方法: 使用倒角修改器。首先创建一个图形(如矩形和圆),然后对齐它们,将它们转化为可编辑样条线,并附加在一起,选择要倒角的边缘,然后使用倒角修改器来调整高度、轮廓等参数。使用倒角剖面修…

【稳定检索|投稿优惠】2024年医学、药学与生物工程国际会议(ICMPB 2024)

2024年医学、药学与生物工程国际会议(ICMPB 2024) 2024 International Conference on Medicine, Pharmacy, and Biotechnology 【会议简介】 2024年医学、药学与生物工程国际会议将于长沙召开。此次会议将汇聚全球医学、药学与生物工程领域的顶尖学者…

MIT 6.5840(6.824) Lab2:Key/Value Server 设计实现

1 实验要求 在本次 Lab 中,你将在单机上构建一个键/值服务器,以确保即使网络出现故障,每个操作也只能执行一次,并且操作是可线性化的。 客户端可以向键/值服务器发送三个不同的 RPC: Put(key, value) 、 Append(key,…

【Linux】进程间通信(一)---- 匿名管道

【Linux】进程间通信(一)---- 匿名管道 一.序1什么是进程间通信2.进程间通信的标准3.为什么需要进程通信 二.匿名管道1.原理2.使用3.四种情况4.五个特点 一.序 1什么是进程间通信 进程间通信 通信我们大致知道是啥,就是互相传递信息 那进程…

【软考】设计模式之组合模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优点6. 缺点7. java示例 1. 说明 1.将对象组合成树型结构以表示“部分-整体”的层次结构。2.Composite使得用户对单个对象和组合对象的使用具有一致性。3.组合模式(Composite Pattern)是一种结构型设计模式 …

德昂信息-Wyn助力构建HR人员信息分析看板

”葡萄城的Wyn商业智能软件产品为德昂信息提供了强大的支持,借助Wyn商业智能软件,可以通过可视化方式展示整个公司的人员信息及其分析看板。“ ——德昂信息技术(北京)有限公司 公司简介 德昂信息技术(北京)有限公司(以下简称德昂信息&…

STM32_HAL_TIM_通用计时器_实现计时

项目思路 1使用定时器计数每秒一次 2使用一个变量记录定时器响应多少次 3使用UART将记录的次数发出 1STM32Cude设置 1配置时钟源 2打开UART 3打开TIM2 3.1界面介绍 3.2选项介绍 Slave Mode(从模式):当设备被设置为从模式时&#xff0c…

计算机组成原理(超详解!!) 第八节 总线系统

1.总线的概念和结构形态 1.总线(BUS)的基本概念 是构成计算机系统的互联机构,是多个系统功能部件(运算器、控制器、存储器、输入/输出设备)之间进行数据传送的公共通路。 由传输信息的电路和管理信息传输的协议组成…

数据结构【顺序表】

文章目录 1.顺序表的概念线性表物理结构逻辑结构 2.顺序表的分类2.1静态顺序表2.2动态顺序表 3.顺序表接口的实现头文件(SQList.h)如下源文件初始化顺序表销毁顺序表插入扩容尾插头插 封装扩容函数删除尾删头删 查找元素在指定位置前插入数据情况一(指定的位置不是首元素)情况二…

【机器学习】逻辑回归:智能垃圾邮件分类实例

逻辑回归:智能垃圾邮件分类的利器 一、引言二、逻辑回归概述三、垃圾邮件分类实例数据准备特征选择与建模 四、总结与展望 一、引言 随着互联网的迅猛发展,电子邮件已成为人们日常生活和工作中不可或缺的一部分。然而,与此同时,垃…

[蓝桥杯]真题讲解:合并数列(双指针+贪心)

[蓝桥杯]真题讲解&#xff1a;班级活动&#xff08;贪心&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;合并数列&#xff08;双指针贪心&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #define in…