【问题标题】:Load Activity and/or Application Logo Programmatically from Manifest从清单以编程方式加载活动和/或应用程序徽标
【发布时间】:2011-05-24 03:53:13
【问题描述】:

我正在尝试从清单中的定义加载与当前活动和/或其父应用程序关联的徽标。此技术已成功加载与两者关联的标题和图标,但徽标始终返回 null 或 0。

这是我正在使用的清单中的相关信息:

<application
    android:icon="@drawable/ic_launcher"
    android:logo="@drawable/ad_logo"
    android:label="@string/app_name"
    android:hardwareAccelerated="true">

    <activity
        android:name=".MainActivity" 
        android:label="@string/app_name"
        android:logo="@drawable/ad_logo">

activity 是上述活动的一个实例,我尝试了以下方法(结果内联注释):

PackageManager pm = activity.getPackageManager();
ComponentName cn = activity.getComponentName();
ApplicationInfo ai = activity.getApplicationInfo();

//ACTIVITY LABEL: Works
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadLabel(pm);

//APPLICATION LABEL: Works
ai.loadLabel(pm);
//APPLICATION LABEL: Works
pm.getApplicationLabel(ai);

//ACTIVITY ICON: Works
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadIcon(pm);
//ACTIVITTY ICON: Works
pm.getActivityIcon(cn);

//APPLICATION ICON: Works
pm.getApplicationIcon(ai);
//APPLICATION ICON: Works
ai.loadIcon(pm);

//ACTIVITY LOGO: Does not work
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadLogo(pm);
//ACTIVITY LOGO: Does not work
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).logo
//ACTIVITY LOGO: Does not work
pm.getActivityLogo(cn);

//APPLICATION LOGO: Does not work
pm.getApplicationLogo(ai);
//APPLICATION LOGO: Does not work
pm.getApplicationLogo(activity.getApplication().getPackageName());
//APPLICATION LOGO: Does not work
ai.loadLogo(pm);

//APPLICATION LOGO: Does not work
pm.getApplicationInfo(ai.packageName, 0).loadLogo(pm);
//APPLICATION LOGO: Does not work
ai.logo;

有谁知道如何为这些目标中的一个或两个正确加载徽标?

编辑: 徽标支持需要 API 级别 9。我正在测试的设备是模拟器和物理设备,它们都运行 API 级别 10。此代码永远不会在 3.0+ 上执行。

【问题讨论】:

  • 我现在无法测试它,但也许在活动中有一个android:logo 也是一个问题?它是一个应用程序属性,而不是一个活动属性。尝试删除第二个。
  • @Aleadam 我注意到它没有在the specification 中定义,但存在用于加载徽标的方法,并且已在Google's own examples 中使用。我会测试。
  • 方法是fin,我说的是manifest。我将在下面发布更多内容(由于评论限制)
  • 顺便说一句,我很确定您的意思是“此代码将始终在 3.0+ 上执行。”
  • Android 3.0+ 上的原生操作栏将自动处理加载和显示徽标本身。此代码仅适用于 API 级别 9 和 10。

标签: android android-manifest


【解决方案1】:

根据我的测试,您的代码可以在 Honeycomb 设备上正常运行,但不能在 Gingerbread 或以下设备上运行。这似乎意味着android:logo 功能虽然存在于 API 级别 8 中,但并未在底层平台中正确实现。也就是说,Level 8-10 设备上的同一个应用程序 apk 不会保留 logo 属性,但 Level 11 设备会保留。这意味着问题不在于代码或 AndroidManifest.xml,而在于平台。

【讨论】:

  • 我担心会是这个原因。在昨晚进一步探索之后,我现在同意这肯定是操作系统的问题。真可惜,因为它会在我的库中启用一个很棒的功能。
  • 仅供参考,如果您使用拉式解析器直接跟踪清单,这可以完成。 github.com/JakeWharton/ActionBarSherlock/blob/…
【解决方案2】:

如果你看一下android.app.ContextImpl.ApplicationPackageManagerhere)中的代码,你会发现最终它使用了该方法

public Drawable getDrawable(String packageName,int resid,ApplicationInfo appInfo)

(2.3 中的第 2131 到 2173 行)。

那里有几个 Log.w 调用,您可以使用它们来跟踪通过 adb 发生的事情(即,Failure retrieving resources for...)

【讨论】:

    【解决方案3】:

    首先,您需要找到所有已安装的应用程序。为此,我们使用包管理器中的以下方法,

    public abstract List<PackageInfo> getInstalledPackages (int flags)
    

    more info here

    您还可以使用以下方法获取已安装包的信息。

    public abstract List<ApplicationInfo> getInstalledApplications (int flags)
    

    more info here

    现在获取列表后,使用以下方法对其进行迭代。

    public Drawable getDrawable(String packageName,int resid,ApplicationInfo appInfo)
    

    more info here

    每次迭代都会为您提供所查询包的相应可绘制对象。这里 res id 是图标的id..

    R.drawable.icon
    

    【讨论】:

      【解决方案4】:

      @Jake Wharton,您正在尝试检索不存在的东西。与applications 不同,activities 没有单独的徽标属性(应用程序中定义的徽标成为所有活动的默认属性)。这就是为什么您无法从活动中检索到一个。

      【讨论】:

      • 我会满足于应用程序徽标,除非我无法获得其资源 ID 或可绘制。正如我在对该问题的评论中提到的,我知道清单架构没有列出 logo 属性,但 Google's own examples 使用它并且它在 Android 3.0+ 上运行良好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多