获取APK文件的正常图标,不用反射。
一般读取APK的图标可以用,PackageManager里面的getApplicationIcon(ApplicationInfo)来得到一个drawable。但实际使用的时候经常只能得到一个默认的图标,根本不是APK的图标。
然后,网上就有人说这个方法是骗人的,并且提出了一些用反射来实现的。类似这样的方法,http://www.devdiv.com/thread-50949-1-1.html,还是比较复杂的。主要是用到了反射,调用多的话,效率可想而知。
今天突然想到小米的文件浏览器是开源的,所以果断看了一下里面的代码,找到读APK图标的地方,方法很简单,根本不用反射这么麻烦。
下面就是来自小米的文件浏览器中的代码。并且BUG解决办法也给出了。
/* * 采用了新的办法获取APK图标,之前的失败是因为android中存在的一个BUG,通过 * appInfo.publicSourceDir = apkPath;来修正这个问题,详情参见: * http://code.google.com/p/android/issues/detail?id=9151 */ public static Drawable getApkIcon(Context context, String apkPath) { PackageManager pm = context.getPackageManager(); PackageInfo info = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES); if (info != null) { ApplicationInfo appInfo = info.applicationInfo; appInfo.sourceDir = apkPath; appInfo.publicSourceDir = apkPath; try { return appInfo.loadIcon(pm); } catch (OutOfMemoryError e) { Log.e("ApkIconLoader", e.toString()); } } return null; }
代码够简单吧。
作者:holmes Zhang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利。