【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 对象里面一些属性,比如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.mzph.cn/pingmian/10272.shtml

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

相关文章

DPDK e1000 ring buffer

基本原理 如图(盗图) 内存(RAM)和网卡(NIC)之间通过Descriptor ring 交互网络报文数据内存中需要申请内存 packet buffer 的内存池,内存池中的每个实例,地址是物理连续的或者IOVA…

【Vue基础】Vue在组件数据传递详解

Vue核心基础-CSDN博客 先回顾Vue特性: Vue.js 是一个用于构建用户界面的渐进式框架,具有许多强大的特性。以下是一些主要的 Vue 特性: 响应式数据:Vue 使用双向绑定来实现数据的响应式更新。当数据发生变化时,视图会自…

JAVA毕业设计138—基于Java+Springboot+Vue的医院预约挂号小程序(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的医院预约挂号小程序(源代码数据库)138 一、系统介绍 本系统前后端分离带小程序和后台 小程序(用户端),后台管理系统&a…

OpenCv中cv2.subtract(image,blurred)与(image-blurred)的区别

目录 一、cv2.subtract()函数二、cv2.subtract(image,blurred)和(image-blurred)处理效果对比2.1 代码2.2 输出结果 三、总结 一、cv2.subtract()函数 cv2.subtract是OpenCV库中的一个函数,用于进行图像减法运算。它可以很方便地进行两个图像…

鸿蒙OpenHarmony:【关于deps、external_deps的使用】

关于deps、external_deps的使用 在添加一个模块的时候,需要在BUILD.gn中声明它的依赖,为了便于后续处理部件间依赖关系,我们将依赖分为两种——部件内依赖deps和部件间依赖external_deps。 依赖分类 开发前请熟悉鸿蒙开发指导文档&#xff…

conan2 基础入门(01)-介绍

conan2 基础入门(01)-介绍 文章目录 conan2 基础入门(01)-介绍⭐什么是conan官网Why use Conan? ⭐使用现状版本情况个人知名开源企业 ⭐ConanCenter包中心github ⭐说明文档END ⭐什么是conan 官网 官网:Conan 2.0: C and C Open Source Package Manager 一句话来…

XML文档基本语法

XML文档基本语法包括以下几个知识点&#xff1a; 开始标记&#xff08;Start Tag&#xff09;&#xff1a;开始标记是XML元素的起始符号&#xff0c;由左尖括号&#xff08;<&#xff09;和元素名称组成。例如&#xff0c;是一个开始标记&#xff0c;表示一个名为"book…

java后端解决跨域问题常用配置类

在开发前后端分离项目时从前端调用后台请求常常无法响应&#xff0c;这是因为浏览器存在一个跨域问题&#xff0c;只需要添加一个config配置类。 Configuration public class WebConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry regis…

Array.map解析

map方法会创建一个新数组。该方法会循环数组中的每个值&#xff0c;如果仅仅是想循环数组不需要返回值使用数组的forEach方法就可以。原数组中的每个元素都调用一次提供的函数后的返回值组成。Array.map 它接收一个函数 这个函数可以接收三个参数 数组的每个值item 这个值的索引…

SC-Lego-LOAM建图与ndt_localization的实车实现

参考&#xff1a;https://blog.csdn.net/weixin_44303829/article/details/121524380 https://github.com/AbangLZU/SC-LeGO-LOAM.git https://github.com/AbangLZU/ndt_localizer.git 将建图和定位分别使用lego-loam和ndt来进行&#xff0c;实车上的效果非常不错&#xff0c;…

STM32F103学习笔记 | 7.使用寄存器点亮LED灯

int main(void) { // 分析指南者硬件原理图得知要实现点亮灯泡需要将PB0设置为低电位&#xff0c; // 查阅STM32F10x中文手册的端口配置低寄存器&#xff0c;得知一个PB有8个配置位&#xff0c;查阅手册找到了PB0的位置是3:2位置&#xff0c; // 插入未知知识&#xff1a;将端…

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件 <?php class Email { //---设置全局变量 var $mailTo ""; // 收件人 var $mailCC ""; // 抄送 var $mailBCC ""; // 秘密抄送 var $mailFrom ""; // 发件人 var $mailSubje…

获取Android开发板已连接WiFi密码

硬件/软件环境&#xff1a; 1&#xff09;全志芯片开发板A40i 2&#xff09;Android Studio Giraffe | 2022.3.1 Patch 3 连接条件&#xff1a; 1)两端都是USB-A接口线&#xff0c;一端插入电脑端USB接口&#xff0c;另一端插入开发板USB接口&#xff1b; 2&#xff09;Andr…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; #Options local_llm llama3 llm ChatOllama(modellocal_llm, format"json", temperature0) #embeddings #embeddings OllamaEmbeddings(model"nomic-embed-text") embed…

作为网络安全工程师需要掌握的安全小知识!

网络安全风险无处不在&#xff0c;今天为大家梳理了一些网络安全相关的小知识&#xff0c;希望能进一步提升大家的安全意识&#xff0c;帮助大家建立更加安全的网络环境。 一、主机电脑安全 1、操作系统安全&#xff1a;安装操作系统时需要选择合适的版本&#xff0c;及时打补…

(Java)心得:LeetCode——10.正则表达式匹配

一、原题 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 示例 1&#xff1a; 输入&am…

制造业如何选择合适的项目管理软件?(内含软件推荐)

近期&#xff0c;收到很多小伙伴的提问&#xff1a;“想了解制造行业如何选择到合适的项目管理软件&#xff1f;”在竞争激烈的市场环境中&#xff0c;有效的项目管理对于制造业的发展至关重要&#xff0c;而项目管理软件则是重要支撑&#xff0c;能帮助企业更好地规划和跟踪项…

ok_Keil实用小技巧 | Keil定制Hex文件名实现的方法

Keil实用小技巧 | Keil定制Hex文件名实现的方法 echo off REM 可执行文件&#xff08;Hex&#xff09;文件名 set HEX_NAMEDemo REM 可执行文件&#xff08;Hex&#xff09;文件路径 set HEX_PATH.\Objects REM 定制Hex输出路径 set OUTPUT_PATH.\Output REM 软件版本文件…

大模型微调之 在亚马逊AWS上实战LlaMA案例(八)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;八&#xff09; 微调技术 Llama 等语言模型的大小超过 10 GB 甚至 100 GB。微调如此大的模型需要具有非常高的 CUDA 内存的实例。此外&#xff0c;由于模型的大小&#xff0c;训练这些模型可能会非常慢。因此&#xff0c…

element 输入框禁止输入空格以及复制的值进去删除空格(vue自定义指令)开箱即用

实例图&#xff1a; 代码&#xff1a; //输入框禁止输入空格 Vue.directive(noSpace, {bind(el) {//禁止输入空格el.addEventListener("keydown", function (event) {if (event.keyCode 32) {event.preventDefault();}});//复制值时去掉空格el.addEventListener(&q…