2011-01-05 12 views
16

मुझे स्थापित एंड्रॉइड ऐप के लिए आइकन पुनर्प्राप्त करने में कुछ परेशानी हो रही है। निम्न कोड सभी ऐप्स के लिए आइकन लौटाता है, हालांकि, कुछ ऐप्स छोटे आइकन (शायद खींचने योग्य - ldpi फ़ोल्डर से) के साथ वापस आते हैं जबकि कुछ बड़े आइकन वाले होते हैं।एंड्रॉइड में ऐप आइकन प्राप्त करना

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

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

मैं एंड्रॉइड के एप्लिकेशन अनुभाग को प्रबंधित करने के समान आइकन कैसे प्राप्त कर सकता हूं, वही आकार कैसे प्राप्त कर सकता हूं?

उत्तर

19

ऐप्स के पास अलग-अलग आकार के आइकन हो सकते हैं। एंड्रॉइड सेटिंग्स ऐप सिर्फ आपके जैसे आइकन लोड करता है। यह उन्हें प्रदर्शित करते समय आइकन स्केल करता है।

<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

मैं पिछले जवाब क्या Android में 3.0 और अधिक से अधिक लागू होता है के लिए कुछ जोड़ना चाहते हैं:

यहाँ से संकुल/apps/सेटिंग्स/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 (संसाधन ....) सिर्फ वही है जो मुझे चाहिए !! यह उत्तर अधिक सटीक है .. मैं आपूर्ति की सबसे बड़ी आइकन प्राप्त कर सकता हूं, फिर इसे मेरी आवश्यकताओं के रूप में स्केल कर सकता हूं। +1 @ एंड्री – IronBlossom

+2

'getDrawableForDensity (int id, int घनत्व)' एपीआई स्तर 15 में जोड़ा गया था ... – Braj

5

हालांकि, इसका उत्तर लंबे समय से दिया गया है, यहां पूरा कार्य है। उम्मीद है कि यह दूसरों की मदद करेगा।

आइकन प्राप्त करने के लिए, आपको अलग-अलग डीपीआई के लिए आइकन के लिए पूछना चाहिए।

इस प्रयास करें:

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 घनत्व)' एपीआई स्तर 15 में जोड़ा गया था ... उसके नीचे कुछ भी? – Braj

संबंधित मुद्दे