【问题标题】:how to get application's original logo icon?如何获取应用程序的原始徽标图标?
【发布时间】:2014-08-07 06:38:17
【问题描述】:

应用程序的图标可以通过以下代码获取:

Drawable drawable = ResolveInfo.loadIcon(packageManager);

但它是可能被ROM修改的drawable(例如:直角改为圆角),所以我的问题是如何通过程序获得原始徽标图标?

附:一些启动器可以做到这一点,例如 MIUI 启动器。

【问题讨论】:

    标签: android package-managers graphical-logo


    【解决方案1】:

    抱歉回复晚了。但我希望这会对刚接触 android 的人有所帮助。

    此方法将获取与 Activity 关联的图标。

    public static Drawable getOriginalActivityIcon(Context context,ResolveInfo resolveInfo){
        PackageManager packageManager=context.getPackageManager();
        try {
            ActivityInfo info=resolveInfo.activityInfo;
            Drawable drawable = packageManager.getDrawable(info.packageName,info.getIconResource(), packageManager.getApplicationInfo(info.packageName, 0));
            if(drawable==null){
                drawable=resolveInfo.loadIcon(packageManager);
            }
            return drawable;
        }catch (Exception e){
            e.printStackTrace();
        }
        return packageManager.getDefaultActivityIcon();
    }
    

    【讨论】:

      【解决方案2】:
      public static Drawable getApplicationIcon(Context context, String packname){
          PackageManager pm = context.getPackageManager();
          try {
              PackageInfo pInfo = pm.getPackageInfo(packname, 0);
              int resId = pInfo.applicationInfo.icon;
              AssetManager assetManager = AssetManager.class.newInstance();
              AssetManager.class.getMethod("addAssetPath", new Class[]{String.class}).invoke(assetManager, pInfo.applicationInfo.sourceDir);
              Resources oRes = context.getResources();
              Resources resources = new Resources(assetManager, oRes.getDisplayMetrics(), oRes.getConfiguration());
              Drawable result = resources.getDrawable(resId);
              assetManager.close();
              return result;
          } catch (Exception e) {
              e.printStackTrace();
          }
          return pm.getDefaultActivityIcon();
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用PackageManager获取应用程序图标

        PackageManager manager = context.getPackageManager();
        Drawable appIcon = manager.getApplicationIcon(packagename);
        

        【讨论】:

        • 它的功能与 ResolveInfo.loadIcon() 几乎相同,不符合我的要求
        【解决方案4】:

        使用此代码

        getPackageManager().getApplicationIcon(packagename);
        

        【讨论】:

          【解决方案5】:
          Drawable icon = getPackageManager().getApplicationIcon(packageInfo.packageName);
          

          【讨论】:

          • 这个答案已经由现有的 6 岁答案提供。
          • 你可以删除它。
          【解决方案6】:

          结论是,如果存在圆形图标,不存在自适应图标,则无法获得方形图标。除非此系统是使用不同于 AOSP 的 Android 框架定制的,例如 MIUI。

          起初我和你一样,四处寻找加载方形图标的方法。我已经尝试了所有答案,包括这里的答案。
          最后发现如果同时设置了方形和圆形图标,那么Android系统框架在请求图标的ResId时返回圆形图标的ResId。最后我去搜索the code of the Android system framework并验证了这个猜测:

          当开发人员指定自适应应用程序图标和非自适应圆形应用程序图标时,为 v26 API 及更高版本创建一个从圆形图标到常规图标的别名。我们这样做是因为某些设备更喜欢 android:roundIcon 而不是 android:icon ,而不管为两者设置的可绘制对象的 API 级别如何。这种自动锯齿行为允许应用在 API 25 设备上更喜欢 android:roundIcon,而在 API 26 设备上更喜欢自适应图标。

          如果应用程序包含自适应图标并且API级别> = 26,您可以使用它来绘制方形图标。对于example

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-02
            • 1970-01-01
            • 2013-04-04
            • 2011-08-02
            • 2011-06-15
            • 2011-12-13
            • 1970-01-01
            • 2013-05-08
            相关资源
            最近更新 更多