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

news2024/12/29 8:54:00

一般安卓提取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.packageManager
    val packageInfo = packageManager.getPackageArchiveInfo(
        apkFilePath,
        0//PackageManager.GET_ACTIVITIES//GET_META_DATA
    )
    // 2. 访问、修改 packageInfo 对象的 applicationInfo 对象里面一些属性,比如packageName、sourceDir、publicSourceDir、loadIcon
    packageInfo?.applicationInfo?.apply {
        // 2.1. 【关键步骤】设置 包名
        val oldPackageName = packageName// 保存旧的包名,因为下面获取 apk 图标之后要恢复
        packageName = apkFilePath// 将其包名改成一个任意的、唯一的其他字符串,这样获取到的图标才不会冲突
        // 2.2. 【必须步骤】设置源路径:设置sourceDir和publicSourceDir属性为APK文件的路径。这样可以确保加载的是APK文件中的资源,而不是系统资源。
        sourceDir = apkFilePath
        publicSourceDir = apkFilePath// 设置这两个路径之后,同时也会把相关包名的文件设置。所以会导致已安装的和其他文件图标不一样!!!

        // 2.3. 通过 loadIcon 来获取 apk 图标
        val icon = loadIcon(packageManager)

        // 2.4. 【关键步骤】获取到图标之后,先恢复前面修改的包名、源路径,最后才能返回图标
        packageName = oldPackageName// 恢复成原来的包名(修改之前的)
        sourceDir = null// 并且把其他的数据还原为null
        publicSourceDir = null

        // 2.5. 最后返回获取到的图标
        return icon
    }
    return null
}

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

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

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

相关文章

Springboot+mybatis-plus+dynamic-datasource+继承DynamicRoutingDataSource切换数据源

Springbootmybatis-plusdynamic-datasource继承DynamicRoutingDataSource切换数据源 背景 最近公司要求支持saas,实现动态切换库的操作,默认会加载主租户的数据源,其他租户数据源在使用过程中自动创建加入。 解决问题 1.通过请求中设置租…

IEEE(电气电子工程师学会)数据库文献去哪里查询下载

IEEE数据库简介: IEEE(电气电子工程师学会)是目前全球科学技术领域领先的专业机构。其期刊在电气电子工程、计算机科学、人工智能、机器人、自动化控制、遥感和核工程领域的期刊影响因子和被引用量都名列前茅。而其学术会议涉及领域广&#…

2025考研专业课、英语、数学、政治视频大全,整理全了!

考研季又到了,备考的小伙伴们,你们准备好了吗? 时间管理 考研是一场与时间的赛跑,合理安排时间,让复习更高效! - 制定详细的学习计划,每天、每周、每月都有明确目标 - ‍♂️ 保持一定的学习…

Agilent MSO9404A、Keysight MSO9404A示波器,4 GHz,4 通道,20 GSa/s

Agilent MSO9404A、Keysight MSO9404A、HP MSO9404A 示波器,4 GHz,4 通道,20 GSa/s Keysight MSO9404A 示波器配备 15 英寸 XGA 显示屏,封装深度仅为 9 英寸(23 厘米),重量仅为 26 磅&#xff…

联合新能源汽车有限公司出席2024年7月8日杭州快递物流展

参展企业介绍 青岛联合新能源汽车有限公司(简称:联合汽车),是一家专注于纯电动汽车领域创新的科技公司,在国内率先提出车电分离,电池标准化并共享的方案,研发了包含标准电池、电池仓、可换电纯电…

《QT实用小工具·六十二》基于QT实现贝塞尔曲线画炫酷的波浪动画

1、概述 源码放在文章末尾 该项目实现了通过贝塞尔曲线画波浪动画,可控制 颜色密度速度加速度 安装与运行环境 语言:C 框架:Qt 11.3 平台:Windows 将屏幕水平平均分为10块,在一定范围内随机高度的12个点(…

论Java和C++方向选择

目录 1.难度2.就业压力3.岗位选择4.薪资待遇5.选择建议小结 1.难度 Java ,C, 测开,整体来说三个方向难度相当。 1.仅从语法角度来看,c 是掌控一切,知识都要懂一点,而java的特点在于省心,都封装…

【Unity Shader入门精要 第7章】基础纹理补充内容:MipMap原理

1.纹理采样 我们对纹理采样进行显示的过程,可以理解为将屏幕上的一个像素(下文用像素表示)映射到纹理上的一个像素(下文用纹素表示),然后用纹理上的这个像素的颜色进行显示。 理想情况下,屏幕…

河北霖超新材料科技有限公司邀您见证2024杭州数字物流展行业变革

参展企业介绍 河北霖超新材料科技有限公司是一家塑胶注塑制品生产的民营企业。是集模具开发、注塑加工、塑胶制品于一体的塑料配套产品解决方案提供商。主营:ABS塑料件、尼龙垫片、尼龙滑轮、护丝帽、聚氨酯制品、尼龙制品等产品。霖超公司发展几年来生产过几百种产…

AWS基础之Region/AZ/DC概念

从云厂商提供的服务物理地域上来划分,范围从大到小依次是Region-Available Zone-Data Center。 Region(区域):区域与区域之间的距离大概是几百公里或者几千公里。(可以理解为:中国和美国在不同的区域) Available Zon…

SpringBoot学习之SpringBoot(一)之初始化

SpringBoot(一)之初始化 文章目录 SpringBoot(一)之初始化SpringBoot框架 SpringBoot简化配置1. 创建SpringBoot项目关于初始化错误 2. SpringBoot项目结构主类pom.xml1. 关于spring-boot-starter-parent2. 关于spring-boot-starter-web3. 关于spring-boot-starter-test4. 关于…

达梦sql中参数个数太多导致出现SOH等特殊字符报错无效的序列号是不是达梦的bug

mybatis的Mapper.xml中如下: in中的参数大概有1万6千多个,分成每1000个一组拼接成sql,然而在达梦中执行时报如下: Caused by: dm.jdbc.driver.DMException: Invalid sequence noat dm.jdbc.driver.DBError.throwException(DBError.java:710)…

今日分享丨从简单传输到大文件分片上传

在数字化信息时代,文件传输技术的重要性不言而喻。从个人用户日常的文档、图片分享,到企业级的数据交换、云服务存储,再到科研领域庞大的数据集传输,文件传输技术的应用场景日益广泛,需求也日益增长。从简单的文本文件…

Airtest核心API汇总

2024.2.25更新:新增剪切板、Airtest1.3.3touch/swipe支持绝对坐标和相对坐标 2023.9.3更新:Airtest1.2.7新增14个断言、断开连接API;Airtest1.2.10.2新增录屏API; 以下基于airtest1.2.0(截止2021.7.12,最新版本) https…

gif动画图片如何生成?分享制作gif的小妙招

Gif动画图片的制作过程是非常好玩的,通过自制gif表情包让你在社交媒体中与朋友互动更容易。可以通过这种gif表情包的方式来表达你的情感,传递信息,让朋友更容易理解你的想法。想要制作gif动画只需要使用gif动画制作(https://www.g…

非对称加密算法在区块链中的应用

随着数字技术的迅猛发展,区块链技术因其独特的去中心化、不可篡改、透明公开等特性,逐渐成为各行各业关注的焦点。在区块链技术的众多组成部分中,非对称加密算法无疑是其中最为基础和关键的一环。本文旨在探讨非对称加密算法在区块链中的应用…

C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数

目录 什么是多态性? 概念 分类 向上类型转换 功能的早绑定和晚绑定 绑定 绑定与多态的联系 编译时多态(功能的早绑定) 运行时多态(功能的晚绑定) 一般而言 实现功能晚绑定——虚函数 虚函数定义的说明 什么…

CSS表格特殊样式

列组样式 使用colgroup与col标签配合可以定义列祖样式&#xff1a;例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>table,tr,th,td{border: 1px solid #000;}table{border-collapse: coll…

Meilisearch使用过程趟过的坑

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

基于SVPWM控制策略的二极管钳位型NPC逆变器并网闭环simulink仿真

本人搭建了基于SVPWM控制策略的二极管钳位型NPC逆变器并网闭环的simulink仿真模型&#xff0c;该模型采用SVPWM闭环控制实现并网控制。效果优异&#xff0c;配备参考资料&#xff0c;适合新手学习使用。 DC&#xff1a;800V AC:380V 功率&#xff1a;100kw 拓扑&#xff1a;…