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

时间:2013-08-27 07:35:35

标签: android bitmap classcastexception nine-patch

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

希望有人能帮助我。

3 个答案:

答案 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,则需要:

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