一般讀取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; }
代碼夠簡單吧。