2011-01-05 12 views
16

Tengo algunos problemas para recuperar íconos para la aplicación de Android instalada. El siguiente código devuelve íconos para todas las aplicaciones, sin embargo, algunas aplicaciones se devuelven con íconos pequeños (quizás desde la carpeta dibujable - ldpi) mientras que algunas con íconos grandes.Cómo obtener el ícono de la aplicación en Android

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

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

¿Cómo puedo obtener iconos que son todos del mismo tamaño, al igual que en la sección Administrar aplicación de Android?

Respuesta

19

Las aplicaciones pueden tener iconos de diferentes tamaños. La aplicación de Configuración de Android carga íconos como usted. Escala los íconos cuando los muestra.

He aquí un fragmento de paquetes/aplicaciones/Configuración/res/layout/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

puede dar más detalles, tengo mismo problema –

+1

sin embargo, en la lista lanzador estándar de aplicaciones (no lista de aplicaciones en "Administrar aplicaciones" de pantalla en la configuración) que se ve hermosas grandes iconos (en el pad) a diferencia de los iconos borrosos que se ampliaron de la manera que usted describió. Debe haber alguna otra forma :-( –

18

Quiero añadir algo a lo que la respuesta anterior se aplica a Android 3.0 y superior.

Puede observar que los iconos recuperados de esta manera estándar (es decir, applicationInfo.loadIcon y otros métodos típicos) son más pequeños que los iconos que ve en la aplicación de inicio. Escalar solo hace que los iconos se vuelvan más borrosos. Si quieres iconos grandes, puedes usar el siguiente código (lo tomé del código fuente del iniciador, puedes encontrar here y cambiarlo un poco). Preste atención al método activityManager.getLauncherLargeIconDensity.

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); 
} 

Espero que ayude a alguien.

+0

getFullResIcon (Resources ....) es justo lo que necesito !! Esta respuesta es más precisa..puedo obtener el ícono más grande proporcionado y luego puede escalarlo según mis necesidades. +1 @ Andrei – IronBlossom

+2

'getDrawableForDensity (int id, int density)' se agregó en el nivel 15 de la API ... ¿Se agregó algo más por debajo de? – Braj

5

Aunque, esto ha sido respondido hace mucho tiempo, aquí está la función completa. Espero que ayude a otros.

Para obtener el icono, debe consultar el icono para diferentes ppp.

Prueba esto:

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) 'en el nivel 15 de la API ... ¿Algo por debajo de eso? – Braj

Cuestiones relacionadas