从packageManager中检索xhdpi应用程序图标?

mik*_*ike 4 icons android drawable

我的应用程序中有一个活动,其中生成了所有已安装应用程序的ListView.除应用名称外,还会显示应用图标.我创建了一个对象数组,其中包含有关应用程序的所有信息,其中包括图标,并使用以下方法检索图标:

drawableAppIcon = mPackageManager.getApplicationIcon(apps.applicationInfo);
Run Code Online (Sandbox Code Playgroud)

application一个<PackageInfo>对象.这个问题是,虽然我可以随时访问所有可绘制的内容,但各种应用程序似乎可以提供各种质量的绘图; 一个应用程序图标将是非常高的res,而另一个将是低分辨率版本.我原以为上面的代码行会占用屏幕大小并找到合适的图标,但事实并非如此.有没有可以解释屏幕尺寸的替代方案?或者更优选的是,有一种方法可以提取最高分辨率图标,然后根据屏幕尺寸缩小它,这基本上可以保证它们看起来都干净吗?

编辑:我找到了一个解决方案,但它只适用于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();
}
Run Code Online (Sandbox Code Playgroud)

对于其他人的参考,如果某人有适用于旧版本Android的解决方案,这将非常有用.

Dan*_*ite 7

我怀疑还有一些其他原因导致图标看起来很糟糕(比如在你的应用程序中调整大小),但是如果你需要为任何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);
Run Code Online (Sandbox Code Playgroud)


小智 6

ApplicationInfo applicationInfo = 
        packagemanager.getApplicationInfo(packageName(), PackageManager.GET_META_DATA);
Resources res = packagemanager.getResourcesForApplication(applicationInfo);
Drawable appIcon = res.getDrawableForDensity(applicationInfo.icon, 
                                             DisplayMetrics.DENSITY_XXXHIGH, 
                                             null);
Run Code Online (Sandbox Code Playgroud)