Подтвердить что ты не робот

Получение значка приложения в Android

У меня возникли проблемы с поиском значков для установленного приложения для Android. Следующий код возвращает значки для всех приложений, однако некоторые приложения возвращаются с небольшими значками (возможно, из папки drawable - ldpi), а некоторые с большими значками.

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

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

Как я могу получить значки с одинаковым размером, как в разделе "Управление приложениями Android"?

4b9b3361

Ответ 1

В приложениях могут быть только значки разных размеров. Приложение Android Settings загружает значки точно так же, как вы. Он масштабирует значки при их отображении.

Вот фрагмент из пакетов /apps/Settings/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"/>

Ответ 2

Я хочу добавить что-то к предыдущему ответу, что относится к Android 3.0 и выше.

Вы можете заметить, что значки, полученные таким стандартным способом (я имею в виду applicationInfo.loadIcon и другие типичные методы), меньше, чем значки, которые вы видите в приложении запуска. Масштабирование просто делает значки размытыми. Если вам нужны большие значки, вы можете использовать следующий код (я взял его из исходного кода запуска, вы можете найти здесь и немного изменился). Обратите внимание на метод 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);
}

Надеюсь, что это поможет кому-то.

Ответ 3

Хотя на это уже давно ответили, вот полная функция. Надеюсь, это поможет другим.

Чтобы получить значок, вы должны запросить значок для разных 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);
    }