【问题标题】:Getting App Icon in Android在 Android 中获取应用程序图标
【发布时间】:2011-01-05 04:07:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

    我想在之前的回答中添加一些适用于 Android 3.0 及更高版本的内容。

    您会注意到以这种标准方式(我的意思是 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);
    }
    

    希望对某人有所帮助。

    【讨论】:

    • getFullResIcon(Resources....) 正是我所需要的!!这个答案更准确..我可以获得提供的最大图标,然后可以根据需要对其进行缩放。 +1 @安德烈
    • getDrawableForDensity(int id, int density) 在 api 级别 15 中添加...低于此级别的任何内容?
    【解决方案2】:

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

    这是来自 packages/apps/Settings/res/layout/manage_applications_item.xml 的 sn-p:

    <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"/>
    

    【讨论】:

    • 你能详细说明一下吗,我也有同样的问题
    • 但是,在标准启动器应用程序列表(不是设置中“管理应用程序”显示的应用程序列表)中,您会看到漂亮的大图标(在键盘上),不像按照您描述的方式放大的模糊图标.必须有其他方式:-(
    【解决方案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);
        }
    

    【讨论】:

    • getDrawableForDensity(int id, int density) 已添加到 api 级别 15... 低于此级别吗?
    【解决方案4】:

    您必须在 App 类中定义;

    private Drawable appIcon; 
    
    public Drawable getappIcon(){
            return this.appIcon;
        }
    

    如果你使用 RecyclerViewAdapter ;

       List<App> list_app;
    
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.appIcon.setImageDrawable(list_app.get(position).getappIcon());
    
        }
    

    在 MainActivity 中;

    private List<App> appList;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final PackageManager pm = getPackageManager();
            List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
    
            appList = new ArrayList<App>();
    
            for (ApplicationInfo packageInfo : packages) {
              Drawable drawableIcon =packageInfo.loadIcon(getPackageManager());
              appList.add(new App (drawableIcon));
    
            }
    

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 2012-11-16
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多