2011-01-05 15 views
16

我在检索已安装的Android应用程序的图标时遇到了一些问题。以下代码会返回所有应用程序的图标,但是,有些应用程序会返回小图标(可能来自drawable - ldpi文件夹),而有些应用程序则带有大图标。在Android中获取应用程序图标

List<PackageInfo> package = getPackageManager().getInstalledPackages(0); 

for(PackageInfo p : package){ 
    iApp.icon = p.applicationInfo.loadIcon(getPackageManager()); 
} 

如何获取所有大小相同的图标,就像在Android的“管理应用程序”部分一样?

回答

19

应用程序可能只有不同大小的图标。 Android设置应用程序像你一样加载图标。它在显示图标时缩放图标。

下面是从封装/应用/设置/ RES /布局/ manage_applications_item.xml一个片段:

<ImageView android:id="@+id/app_icon" 
    android:layout_width="@android:dimen/app_icon_size" 
    android:layout_height="@android:dimen/app_icon_size" 
    android:layout_marginRight="11dip" 
    android:layout_gravity="center_vertical" 
    android:scaleType="fitCenter"/> 
+0

你能否详细说明,我有同样的问题 – 2011-06-07 06:09:54

+1

然而,在应用程序的标准发射器列表(没有应用程序列表中的“管理应用程序”中设置显示),你看到漂亮的大图标(不同于模糊的图标,按照您所描述的方式放大。必须有其他方式:-( – 2013-04-29 11:27:22

18

我想补充的东西以前的答案是什么适用于Android 3.0的大。

您可以注意到以这种标准方式(我的意思是applicationInfo.loadIcon和其他典型方法)检索到的图标小于您在启动器应用程序中看到的图标。放大只是使图标模糊。如果你想要大图标,你可以使用下一个代码(我从启动程序的源代码中找到它,你可以找到here并改变了一下)。请注意0​​方法。

public Drawable getFullResDefaultActivityIcon() { 
    return getFullResIcon(Resources.getSystem(), android.R.mipmap.sym_def_app_icon); 
} 

public Drawable getFullResIcon(Resources resources, int iconId) { 
    Drawable d; 
    try { 
     ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); 
     int iconDpi = activityManager.getLauncherLargeIconDensity(); 
     d = resources.getDrawableForDensity(iconId, iconDpi); 
    } catch (Resources.NotFoundException e) { 
     d = null; 
    } 

    return (d != null) ? d : getFullResDefaultActivityIcon(); 
} 

public Drawable getFullResIcon(String packageName, int iconId) { 
    Resources resources; 
    try { 
     resources = mContext.getPackageManager().getResourcesForApplication(packageName); 
    } catch (PackageManager.NameNotFoundException e) { 
     resources = null; 
    } 
    if (resources != null) { 
     if (iconId != 0) { 
      return getFullResIcon(resources, iconId); 
     } 
    } 
    return getFullResDefaultActivityIcon(); 
} 

public Drawable getFullResIcon(ResolveInfo info) { 
    return getFullResIcon(info.activityInfo); 
} 

public Drawable getFullResIcon(ActivityInfo info) { 
    Resources resources; 
    try { 
     resources = mContext.getPackageManager().getResourcesForApplication(info.applicationInfo); 
    } catch (PackageManager.NameNotFoundException e) { 
     resources = null; 
    } 
    if (resources != null) { 
     int iconId = info.getIconResource(); 
     if (iconId != 0) { 
      return getFullResIcon(resources, iconId); 
     } 
    } 
    return getFullResDefaultActivityIcon(); 
} 

private Drawable getAppIcon(ResolveInfo info) { 
    return getFullResIcon(info.activityInfo); 
} 

希望它可以帮助别人。

+0

getFullResIcon(资源....)就是我所需要的!!这个答案更精确..我可以得到最大的图标,然后可以根据我的需要调整它。+1 @ Andrei – IronBlossom 2013-05-31 09:51:14

+2

'getDrawableForDensity(int id,int density)'被添加到api level 15 ...下面的任何东西? – Braj 2014-04-14 10:12:00

5

虽然,这已经回答很久了,这里是完整的功能。希望它能帮助别人。

要获取图标,您应该查询不同dpi的图标。

试试这个:

public static Drawable getIconFromPackageName(String packageName, Context context) 
    { 
     PackageManager pm = context.getPackageManager(); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) 
     { 
      try 
      { 
       PackageInfo pi = pm.getPackageInfo(packageName, 0); 
       Context otherAppCtx = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY); 

       int displayMetrics[] = {DisplayMetrics.DENSITY_XHIGH, DisplayMetrics.DENSITY_HIGH, DisplayMetrics.DENSITY_TV}; 

       for (int displayMetric : displayMetrics) 
       { 
        try 
        { 
         Drawable d = otherAppCtx.getResources().getDrawableForDensity(pi.applicationInfo.icon, displayMetric); 
         if (d != null) 
         { 
          return d; 
         } 
        } 
        catch (Resources.NotFoundException e) 
        { 
//      Log.d(TAG, "NameNotFound for" + packageName + " @ density: " + displayMetric); 
         continue; 
        } 
       } 

      } 
      catch (Exception e) 
      { 
       // Handle Error here 
      } 
     } 

     ApplicationInfo appInfo = null; 
     try 
     { 
      appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA); 
     } 
     catch (PackageManager.NameNotFoundException e) 
     { 
      return null; 
     } 

     return appInfo.loadIcon(pm); 
    } 
+0

'getDrawableForDensity(int id,int density)'被添加到api level 15 ...下面的任何东西? – Braj 2014-04-14 10:22:11

相关问题