【问题标题】:Get All Installed Application icons in Android : java.lang.ClassCastException在 Android 中获取所有已安装的应用程序图标:java.lang.ClassCastException
【发布时间】:2025-12-01 01:00:01
【问题描述】:

当我尝试获取已安装的应用程序图标时,有一个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

希望有人可以帮助我。

【问题讨论】:

标签: android bitmap classcastexception nine-patch


【解决方案1】:

您的问题是您的图标不是 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;
}

这个解决方案在任何情况下都可以工作

【讨论】:

    【解决方案2】:
    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 行)。

    【讨论】:

      【解决方案3】:
      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,则需要:

      • 创建可变位图。
      • 使用 Canvas.DrawDrawable 绘制可绘制对象

      【讨论】:

      • 我没有投反对票,但我看到消息“方法 getBitmap() 未定义为 NinePatchDrawable 类型”