11

有一个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

希望有人可以帮助我。

4

3 回答 3

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

这个解决方案在任何情况下都有效

于 2013-08-27T07:44:06.670 回答
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 绘制可绘制对象
于 2013-08-27T07:51:48.563 回答
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 行)。

于 2013-08-27T07:41:36.410 回答