2013-08-27 41 views
11

當我試圖獲取已安裝的應用程序圖標時,有一個java.lang.ClassCastException在Android中獲取所有安裝的應用程序圖標:java.lang.ClassCastException

這是我的代碼。

public Bitmap getAppIcon(String path) { 
     PackageInfo pi = pm.getPackageArchiveInfo(path, 0); 
     pi.applicationInfo.sourceDir = path; 
     pi.applicationInfo.publicSourceDir = path; 
     Drawable icon = pi.applicationInfo.loadIcon(pm); 
     Bitmap APKicon = ((BitmapDrawable) icon).getBitmap(); 
     return APKicon; 
    } 

其中,pm

PackageManager pm = getPackageManager(); 

,並在LogCat所示的錯誤是

Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable 

希望有人能幫助我。

+0

檢查這個話題請http://stackoverflow.com/questions/10623570/how-to-programmatically-re-apply-a-9-patch-image-to -an-imageview –

回答

19

您的問題是,你的圖標沒有BitmapDrawable的情況下,可以檢查這樣的:

Bitmap APKicon; 
if(icon instanceof BitmapDrawable) { 
    APKicon = ((BitmapDrawable)icon).getBitmap(); 
} 
在這種情況下

您的解決方案是正確的話,只投它,但如果沒有(和是你的情況下),一個需要做這樣的事情:

else{ 
    Bitmap bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(),icon.getIntrinsicHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    icon.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
    icon.draw(canvas); 
    APKicon = bitmap; 
} 

該解決方案將在任何情況下工作

+0

好!這項工作!謝謝! –

0
public Bitmap getAppIcon(String path) { 
    PackageInfo pi = pm.getPackageArchiveInfo(path, 0); 
    Drawable icon = pi.applicationInfo.loadIcon(pm); 
    Bitmap APKicon = ((NinePatchDrawable) icon).getBitmap(); 
    return APKicon; 
} 

您必須將圖標投入NinePatchDrawable(第4行)。

0
Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable 

問題:

您正試圖強制轉換BitmapDrawableNinePatchDrawable

解決方案:

試試這個:

public Bitmap getAppIcon(String path) { 
     PackageInfo pi = pm.getPackageArchiveInfo(path, 0); 
     pi.applicationInfo.sourceDir = path; 
     pi.applicationInfo.publicSourceDir = path; 
     Drawable icon = pi.applicationInfo.loadIcon(pm); 
     Bitmap APKicon = ((NinePatchDrawable) icon).getBitmap(); // cast to NinePatchDrawable 
     return APKicon; 
    } 

PackageManager.GetApplicationInfo返回Drawable對象。它可能不是BitmapDrawable

您可以測試它是否是一個BitmapDrawable:

如果pm.GetApplicationIcon(packname)BitmapDrawable則...

如果你想在非BitmapDrawable轉換爲BitmapDrawable那麼你需要:

  • 創建一個可變的位圖。
  • 繪製繪製與Canvas.DrawDrawable
+0

downvoter關心評論?? –

+1

我沒有downvote,但我看到消息「該方法getBitmap()未定義類型NinePatchDrawable」 –

相關問題