首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android中获取App Icon

在Android中获取App Icon
EN

Stack Overflow用户
提问于 2011-01-05 12:07:36
回答 4查看 23.5K关注 0票数 19

我在检索已安装的Android应用程序的图标时遇到了一些问题。下面的代码返回所有应用程序的图标,但是,一些应用程序返回的是小图标(可能来自drawable - ldpi文件夹),而另一些应用程序返回的是大图标。

代码语言:javascript
复制
List<PackageInfo> package = getPackageManager().getInstalledPackages(0);

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

我如何才能获得所有相同大小的图标,就像Android的管理应用程序部分一样?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-05 14:03:23

应用程序可能只有不同大小的图标。Android设置应用程序加载的图标就像你一样。它在显示图标时缩放图标。

这是来自packages/apps/Settings/res/layout/manage_applications_item.xml:的一个片段

代码语言:javascript
复制
<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"/>
票数 21
EN

Stack Overflow用户

发布于 2013-04-29 20:58:15

我想在之前的回答中添加一些适用于Android3.0和更高版本的内容。

你可以注意到,用这种标准方法(我的意思是applicationInfo.loadIcon和其他典型方法)检索的图标比你在launcher应用程序中看到的图标要小。放大只会使图标变得更加模糊。如果你想要大图标,你可以使用next代码(我从launcher源代码中拿来的,你可以找到here,然后稍作修改)。请注意activityManager.getLauncherLargeIconDensity方法。

代码语言:javascript
复制
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);
}

希望这能帮助到别人。

票数 22
EN

Stack Overflow用户

发布于 2013-10-29 18:40:49

虽然这个问题很久以前就得到了回答,但这里是完整的函数。希望能对其他人有所帮助。

要获取图标,您应该查询不同dpi的图标。

试试这个:

代码语言:javascript
复制
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);
    }
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4600740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档