外贸做哪个网站好,vs2008做网站,江苏省城乡和住房建设厅网站,产品展示网站方案一般安卓提取apk图标我们有两种常用方法#xff1a;
1、如果已经获取到 ApplicationInfo 对象#xff08;假设名为 appInfo#xff09;#xff0c;那么我们获取方法为#xff1a;
appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…一般安卓提取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
}注意以上只是个人测试代码不保证没有其他结果。其他情况请自行测试