Извлечение значков приложений xhdpi из packageManager?

У меня есть активность в моем приложении, в котором создается ListView всех установленных приложений. Помимо имени приложения появляется значок приложения. Я создал массив объектов, содержащих всю информацию о приложении, среди этого значка, и получил значок, используя:

drawableAppIcon = mPackageManager.getApplicationIcon(apps.applicationInfo); 

Где application является объектом <PackageInfo> . Проблема заключается в том, что, хотя я легко имею доступ ко всем чертежам, различные приложения, похоже, тянут различные качественные чертежи; Один значок приложения будет чрезвычайно высоким, а другой – версией с низким разрешением. Я бы подумал, что указанная выше строка кода учитывала бы размер экрана и находила соответствующие значки, но это не так. Есть ли альтернатива, которая учитывает размер экрана? Или еще более предпочтительно, есть ли способ извлечь только самый высокий значок res, а затем масштабировать его на основе размера экрана, что в основном гарантирует, что все они выглядят чистыми?

EDIT: Я нашел решение, но он работает только для Android 4.0+

 try { Context otherAppCtxt = context.createPackageContext(apps.applicationInfo.packageName, Context.CONTEXT_IGNORE_SECURITY); info.drawableAppIcon = otherAppCtxt.getResources().getDrawableForDensity(apps.applicationInfo.icon, DisplayMetrics.DENSITY_XHIGH); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } 

Для справки других это работает, если у кого-то есть решение для более старой версии Android, которое было бы действительно полезно.

Я подозреваю, что есть и другие причины, по которым значки выглядят плохо (например, изменение размера в вашем приложении), но если вам нужно сделать это для любой версии Android:

 // Get the application's resources Resources res = mPackageManager.getResourcesForApplication(appInfo); // Get a copy of the configuration, and set it to the desired resolution Configuration config = res.getConfiguration(); Configuration originalConfig = new Configuration(config); config.densityDpi = DisplayMetrics.DENSITY_XHIGH; // Update the configuration with the desired resolution DisplayMetrics dm = res.getDisplayMetrics(); res.updateConfiguration(config, dm); // Grab the app icon Drawable appIcon = res.getDrawable(appInfo.icon); // Set our configuration back to what it was res.updateConfiguration(originalConfig, dm); 
 ApplicationInfo applicationInfo = packagemanager.getApplicationInfo(packageName(), PackageManager.GET_META_DATA); Resources res = packagemanager.getResourcesForApplication(applicationInfo); Drawable appIcon = res.getDrawableForDensity(applicationInfo.icon, DisplayMetrics.DENSITY_XXXHIGH, null); 
Intereting Posts
Определять, перекрываются ли виды Не удалось выполнить тесты на эспрессо для Android Уникальный идентификатор приложения для Android Android setOnCheckedChangeListener снова звонит, когда возвращается старый вид Java.util.LinkedHashMap не может быть передан в DataList Где разместить текстовые файлы в каталоге на Android Хорошая идея включить файлы JAR в библиотеку Android (потенциальный конфликт с другими библиотеками)? Ошибка: выполнение выполнено для задачи ': app: transformClassesWithDexForDebug'. > Com.android.build.api.transform.TransformException: .. ненулевое значение выхода 3 OnContextItemSelected не вызывается в диалоговом окне DialogFragment Миграция Android Realm: добавление новой колонки списка Realm Как я могу вызвать метод onDraw () для Android-просмотра 30 раз в секунду Как закрыть приложение в Android Studio-приложение, работающее на отдельном устройстве Панель действий и блок навигации – панель действий с активностью / фрагментом Android – превратить textView в выход журнала Android 'не распознается как внутренняя или внешняя команда