2011-01-05 16 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設定アプリは、あなたのようにアイコンを読み込みます。アイコンを表示するときにアイコンを拡大/縮小します。

<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

を、私はしかし、アプリケーションの標準のランチャーリスト(設定で「管理するアプリケーション」の表示中のアプリではないリスト)にあなたが(美しい大きなアイコンが表示され、同じ問題 –

+1

を持っていますあなたが説明したようにスケールアップされたぼやけたアイコンとは異なり、何か他の方法が必要です:-( –

18

私は3.0以降をAndroidに適用されるものを前の回答に何かを追加したい:

はここでパッケージ/アプリケーション/設定/ RES /レイアウト/ manage_applications_item.xmlからの抜粋です。

この標準的な方法で取得したアイコン(つまり、applicationInfo.loadIconやその他の一般的な方法)は、ランチャーアプリに表示されるアイコンよりも小さいことがわかります。スケールアップするだけで、アイコンがぼやけてしまいます。大きなアイコンが必要な場合は、次のコードを使用することができます(ランチャーのソースコードから取得しました。hereが見つかり、少し変更されています)。 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); 
} 

誰かを助けることを願っています。

+0

getFullResIcon(リソース.... ....)私は必要なものです!この答えはより正確です。私は最大のアイコンを取得することができ、 Andrei – IronBlossom

+2

'getDrawableForDensity(int id、int density)'がAPIレベル15で追加されました...それ以下のものは何ですか? – Braj

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レベル15で追加されました... – Braj

関連する問題