Get All Installed Application icons in Android : java.lang.ClassCastException
Asked Answered
I

3

11

There is a java.lang.ClassCastException when I am trying to get a installed applications icon.

Here is my code.

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

where, pm is

PackageManager pm = getPackageManager();

and the error shown in the LogCat is

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

Hope anybody can help me.

Iota answered 27/8, 2013 at 7:35 Comment(1)
Check this topic please #10624070Claiborne
P
20

Your Problem is that your Icon is no instance of BitmapDrawable, one can check like that:

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

in this case your solution would be right, one can just cast it, but if not (and that is your case) one needs to do something like that:

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

this solution will work in any case

Pedagogy answered 27/8, 2013 at 7:44 Comment(0)
S
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;
}

You have to cast the icon into NinePatchDrawable (line 4).

Saros answered 27/8, 2013 at 7:41 Comment(0)
S
0
Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable

Problem :

You are trying to typecast BitmapDrawable to NinePatchDrawable

Solution:

Try this:

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 returns a Drawable object. It might not be a BitmapDrawable.

You can test whether it is a BitmapDrawable with:

If pm.GetApplicationIcon(packname) Is BitmapDrawable Then ...

If you want to convert a non-BitmapDrawable to a BitmapDrawable then you need to:

  • Create a mutable bitmap.
  • Draw the drawable with Canvas.DrawDrawable
Sievert answered 27/8, 2013 at 7:51 Comment(1)
I didn't downvote, but I see the message "The method getBitmap() is undefined for the type NinePatchDrawable"Loch

© 2022 - 2024 — McMap. All rights reserved.