2011-01-05 21 views
16

ich einige Probleme mit Icons für installierte Android App abgerufen werden. Der folgende Code gibt Symbole für alle Apps zurück. Einige Apps werden jedoch mit kleinen Symbolen (z. B. aus dem ldpi-Ordner) zurückgegeben, andere hingegen mit großen Symbolen.Erst App Icon in Android

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

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

Wie kann ich Symbole erhalten, die alle die gleiche Größe haben, wie im Abschnitt "Anwendung verwalten" von Android?

Antwort

19

Apps haben könnte nur verschieden große Symbole. Die App "Android-Einstellungen" lädt Symbole genau wie Sie. Es skaliert die Symbole, wenn sie angezeigt werden.

Hier ist ein Ausschnitt aus packages/apps/Einstellungen/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

können Sie das näher erläutern, i –

+1

jedoch gleiche Problem haben, in Standard-Launcher Liste der Anwendungen (nicht Liste der Anwendungen in "Anwendungen verwalten" Anzeige in den Einstellungen) können Sie schöne große Symbole angezeigt werden (auf dem Pad) im Gegensatz zu verschwommenen Symbolen, die wie von Ihnen beschrieben skaliert wurden. Es muss einen anderen Weg geben :-( –

18

ich etwas zur vorherigen Antwort hinzufügen möchten, was 3.0 und höher auf Android gilt.

können Sie feststellen, dass in diesem Standardverfahren abgerufen Symbole (ich meine applicationInfo.loadIcon und andere typische Methoden) kleiner sind als Symbole, die Sie in Launcher App sehen. Scale up macht nur verschwommene Icons. Wenn Sie große Symbole wollen, können Sie den nächsten Code verwenden (ich nahm es aus dem Launcher-Quellcode, den Sie finden können here und änderte ein bisschen). Achten Sie auf activityManager.getLauncherLargeIconDensity Methode.

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

Ich hoffe, es hilft jemandem.

+0

getFullResIcon (Ressourcen ....) ist genau das, was ich brauche !! Diese Antwort ist präziser..ich kann das größte Icon bekommen, das geliefert wird, kann es dann skalieren wie ich es brauche. Andrei – IronBlossom

+2

'getDrawableForDensity (int id, int Dichte)' wurde in api Ebene hinzugefügt 15 ... Alles unter dem? – Braj

5

Obwohl dies eine lange Zeit zurück beantwortet wurde, hier ist die komplette Funktion. Ich hoffe, es wird anderen helfen.

das Symbol zu erhalten, sollten Sie sich für Symbol für verschiedene dpi abfragen.

Try this:

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 Dichte)' wurde in api Ebene hinzugefügt 15 ... Alles unter dem? – Braj