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