Получить все установленные иконки приложений в Android: java.lang.ClassCastException

При попытке получить значок установленных приложений есть 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

Надеюсь, кто-нибудь может мне помочь.

Ответ 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) Is BitmapDrawable Затем...

Если вы хотите конвертировать не BitmapDrawable в BitmapDrawable, вам необходимо:

  • Создайте измененное растровое изображение.
  • Нарисуйте drawable с помощью Canvas.DrawDrawable