2013-08-27 12 views
11

Podczas próby uzyskania ikony zainstalowanych aplikacji istnieje java.lang.ClassCastException.Pobierz wszystkie zainstalowane ikony aplikacji w systemie Android: java.lang.ClassCastException

Oto mój kod.

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

gdzie pm jest

PackageManager pm = getPackageManager(); 

a błąd pokazany na LogCat jest

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

Nadzieja ktoś może mi pomóc.

+0

Sprawdzić tym temacie proszę http://stackoverflow.com/questions/10623570/how-to-programmatically-re-apply-a-9-patch-image-to -an-imageview –

Odpowiedz

19

Twój problem jest to, że ikona nie jest instancją BitmapDrawable można sprawdzić tak:

Bitmap APKicon; 
if(icon instanceof BitmapDrawable) { 
    APKicon = ((BitmapDrawable)icon).getBitmap(); 
} 

w tym przypadku rozwiązanie byłoby w porządku, można po prostu rzucać, ale jeśli nie (i to to twoja sprawa) trzeba zrobić coś takiego:

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

to rozwiązanie będzie działać w każdym przypadku

+0

Dobrze! ta praca! dzięki! –

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

Musisz rzucić ikonę w NinePatchDrawable (linia 4).

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

Problem:

Próbujesz typecast BitmapDrawable do NinePatchDrawable

Rozwiązanie:

Spróbuj tego:

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 zwraca Drawable obiekt. To może nie być BitmapDrawable.

Można sprawdzić, czy jest to BitmapDrawable z:

Jeśli pm.GetApplicationIcon(packname) Czy BitmapDrawable Potem ...

Jeśli chcesz przekonwertować non-BitmapDrawable do BitmapDrawable to trzeba:

  • Utwórz zmienną mapę bitową.
  • Narysuj rozciągliwej z Canvas.DrawDrawable
+0

Downa opieka nad komentarzem? –

+1

Nie przesłałem, ale widzę komunikat "Metoda getBitmap() jest niezdefiniowana dla typu NinePatchDrawable" –

Powiązane problemy