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

2024-05-12 04:52

本文主要是介绍【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
}

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

这篇关于【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981656

相关文章

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S