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

 

代碼夠簡單吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM