在安卓系统中获取所有已安装应用程序图标:java.lang.ClassCastException

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

希望有人能帮助我。


请查看此主题 https://dev59.com/_GPVa4cB1Zd3GeqP-OqN - Lia Pronina
3个回答

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

这个解决方案将适用于任何情况


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行)。


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,则需要执行以下操作:

  • 创建一个可变位图。
  • 使用 Canvas.DrawDrawable 绘制 drawable。

1
我没有点踩,但是我看到了这个消息:“方法getBitmap()在类型NinePatchDrawable中未定义”。 - Someone Somewhere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接