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.
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
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).
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
来源:https://stackoverflow.com/questions/18459618/get-all-installed-application-icons-in-android-java-lang-classcastexception