当我尝试获取已安装的应用程序图标时,有一个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 :(得分:19)
您的问题是您的Icon不是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;
}
此解决方案无论如何都适用
答案 1 :(得分: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行)。
答案 2 :(得分:0)
Caused by: java.lang.ClassCastException: android.graphics.drawable.NinePatchDrawable cannot be cast to android.graphics.drawable.BitmapDrawable
问题:
您正试图将BitmapDrawable
强制转换为NinePatchDrawable
<强>解决方案:强>
试试这个:
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,则需要: