2011-01-05 5 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 이상을 안드로이드에 적용 무엇을 이전의 대답에 뭔가를 추가 할 :

여기 패키지/응용 프로그램/설정/고해상도/레이아웃/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 (Resources ....) 그냥 내가 뭘 필요합니다!이 대답은 더 정확합니다 .. 나는 내 요구대로 확장 할 수있는 가장 큰 아이콘을 얻을 수 있습니다. +1 @ Andrei – IronBlossom

+2

API 레벨 15에 getDrawableForDensity (int id, int density)가 추가되었습니다 ... – 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

관련 문제