У меня есть активность в моем приложении, в котором создается 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);