我的应用中有一项活动,其中生成了所有已安装应用的ListView。除应用名称外,还会显示应用图标。我创建了一个对象数组,其中包含有关应用程序的所有信息,其中包括图标,并使用以下方法检索图标:
drawableAppIcon = mPackageManager.getApplicationIcon(apps.applicationInfo);
其中application
是<PackageInfo>
个对象。这个问题是,虽然我可以随时访问所有可绘制的内容,但各种应用程序似乎可以提供各种质量的绘图;一个应用程序图标将是非常高的res,而另一个将是低分辨率版本。我原以为上面的代码行会占用屏幕大小并找到合适的图标,但事实并非如此。有没有可以解释屏幕尺寸的替代方案?或者甚至更优选的是有一种方法可以提取最高分辨率图标,然后根据屏幕尺寸缩小它,这基本上可以保证它们看起来都干净吗?
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的解决方案,这将非常有用。
答案 0 :(得分:6)
我怀疑还有其他原因导致图标看起来不好(例如在您的应用中调整大小),但如果您需要为任何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);
答案 1 :(得分:4)
ApplicationInfo applicationInfo =
packagemanager.getApplicationInfo(packageName(), PackageManager.GET_META_DATA);
Resources res = packagemanager.getResourcesForApplication(applicationInfo);
Drawable appIcon = res.getDrawableForDensity(applicationInfo.icon,
DisplayMetrics.DENSITY_XXXHIGH,
null);
答案 2 :(得分:0)
这是一个老问题的新答案,只是将所有内容放在一起。您需要获取设备的默认密度,并调整图像大小以确保您拥有合适的尺寸,因为仅请求图标并不总是返回正确的尺寸。
考虑以下两种方法,一种获取设备尺寸,另一种调整可绘制对象的大小:
private int getDeviceDpi(){
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.densityDpi;
}
private Drawable getSizedAppIcon(Context context, String packageName, int Density) throws PackageManager.NameNotFoundException {
//for @param Density you can use a static from DisplayMetrics.<something>
PackageManager pm = Objects.requireNonNull(context).getPackageManager();
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(packageName, 0);
Drawable icon = pm.getApplicationIcon(appInfo);
Bitmap bitmap = ((BitmapDrawable) icon).getBitmap();
switch (Density){
case DisplayMetrics.DENSITY_LOW: //120
return new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap,
32, 32, true));
case DisplayMetrics.DENSITY_MEDIUM: //160
return new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap,
48, 48, true));
case DisplayMetrics.DENSITY_HIGH: //240
return new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap,
72, 72, true));
case DisplayMetrics.DENSITY_XHIGH: //320
return new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap,
96, 96, true));
case DisplayMetrics.DENSITY_XXHIGH: //480
return new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap,
144, 144, true));
case DisplayMetrics.DENSITY_XXXHIGH: //640
return new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap,
192, 192, true));
default:
return icon;
}
}
然后像下面的示例一样称呼他们
try{
getSizedAppIcon(this, "com.example.app",getDeviceDpi());
}catch (Exception ignore) {}