获取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;
    }

 

代码够简单吧。

posted @ 2012-04-25 15:24  holmes Zhang  阅读(7795)  评论(3编辑  收藏  举报