【问题标题】:How to add a notification badge/count to application icon on Sony Xperia devices?如何为 Sony Xperia 设备上的应用程序图标添加通知徽章/计数?
【发布时间】:2013-11-26 12:13:52
【问题描述】:

借助 Sony 的 Xperia Home,某些应用可以在应用图标上显示计数气泡或徽章。 Facebook 和 Facebook Messenger 以及内置的电子邮件应用程序都这样做。

这是solved for Samsung's launcher,但我没有遇到任何关于如何为索尼的启动器执行此操作的文档。

怎么做?

【问题讨论】:

标签: android count notifications badge sony


【解决方案1】:

在看到 Daniel Ochoa 的三星启动器解决方案(使用 BadgeProvider 来处理徽章)后,我开始为索尼的 Xperia Home 做同样的事情。这个答案是直接from my blog拍的。

我是怎么想出来的 - 对于任何感兴趣的人

我偶然发现了Sony's AppXplore,并用它来检查 Facebook 应用程序的权限。 Facebook 应用请求以下权限,这是在 Sony 设备上显示徽章的关键:

com.sonyericsson.home.permission.BROADCAST_BADGE

接下来,我查看了all available content providers,但没有发现与应用图标徽章相关的内容。 我运行command in this answer 以获取系统转储文件并使用记事本++ 搜索“徽章”。我发现了这个:

com.sonyericsson.home.action.UPDATE_BADGE: 41be9a90 com.sonyericsson.home/.BadgeService$BadgeReceiver 过滤器 41be9858

因此,它是使用 Sony 上的 BroadcastReciever 处理的,而不是三星的 Content Provider。因此,我创建了一个自己的虚拟 BroadcastReciever,监听动作 com.sonyericsson.home.action.UPDATE_BADGE,并发现附加信息传递给了 Sony 的 BadgeService。 为此,我还需要一个权限,但这很容易在转储文件中找到:

com.sonyericsson.home.permission.RECEIVE_BADGE

Facebook、电子邮件应用程序等发送的附加内容是:

  • com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME - 您的应用的主要活动的名称,android.intent.action.MAIN。这是 所以启动器知道在哪个图标上显示徽章。
  • com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE - 一个 布尔值,指示我们是否要显示徽章(我们会这样做!)
  • com.sonyericsson.home.intent.extra.badge.MESSAGE - 一个字符串 (不是整数 - 我花了一段时间才意识到......)与数字 展示。
  • com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME - 您的应用程序包的名称。

如何在 Sony Xperia 设备上的应用启动器图标上显示徽章

因此,在启动器中的应用程序图标上显示徽章非常简单。 IMO 它比三星的发射器更直接。 这是一个分步指南(而且不长!)

  1. 在清单文件中声明 com.sonyericsson.home.permission.BROADCAST_BADGE 权限:

  2. Intent 广播到BadgeReceiver

    Intent intent = new Intent();
    
    intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.yourdomain.yourapp.MainActivity");
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "99");
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", "com.yourdomain.yourapp");
    
    sendBroadcast(intent);
    
  3. 完成。广播此Intent 后,启动器应在您的应用程序图标上显示一个徽章。

  4. 要再次移除徽章,只需发送一个新广播,这次将 SHOW_MESSAGE 设置为 false:

    intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
    

很高兴知道

消息是一个字符串!

由于MESSAGEString,您实际上可以在徽章中添加单词:

intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "Testing");

但我不会这样做,因为它看起来很奇怪。

您可以访问所有应用程序!

BROADCAST_BADGE 权限不仅可以让您访问自己应用的图标,还可以访问所有图标。例如,以下是设置 Facebook 徽章的方法:

Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.facebook.katana.LoginActivity");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "99");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", "com.facebook.katana");

sendBroadcast(intent);

我希望这对某人有所帮助! :)

【讨论】:

  • 感谢分享!
  • 既然这是一个广播接收器,我猜没有办法查询您当前的徽章记录?此外,Sony 是否区分 UPDATE_BADGE 和 CREATE_BADGE?即使您以前从未创建过徽章记录,您是否总是发送 UPDATE_BADGE?
  • @Daniel Ochoa 据我所知,UPDATE_BADGE 总是被使用,没有 CREATE_BADGE。是的,即使没有以前的徽章,也会使用 UPDATE_BADGE。不,我认为您看不到徽章当前所说的内容 - 您必须手动跟踪它。 :)
  • 作为对此的更新,第三方启动器 Apex 也支持与索尼启动器类似的徽章:forum.xda-developers.com/showthread.php?t=1930365
  • @Marcus 这个代码只能用于 Sony Xperia 设备吗?
【解决方案2】:

我将这个类用于三星、索尼和 HTC 设备(也可以使用https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f)。不要忘记将<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> 添加到AndroidManifest.xml

public class BadgeUtils {


    public static void setBadge(Context context, int count) {
        setBadgeSamsung(context, count);
        setBadgeSony(context, count);
    }

    public static void clearBadge(Context context) {
        setBadgeSamsung(context, 0);
        clearBadgeSony(context);
    }


    private static void setBadgeSamsung(Context context, int count) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }
        Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
        intent.putExtra("badge_count", count);
        intent.putExtra("badge_count_package_name", context.getPackageName());
        intent.putExtra("badge_count_class_name", launcherClassName);
        context.sendBroadcast(intent);
    }

    private static void setBadgeSony(Context context, int count) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }

        Intent intent = new Intent();
        intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count));
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());

        context.sendBroadcast(intent);
    }


    private static void clearBadgeSony(Context context) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }

        Intent intent = new Intent();
        intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(0));
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());

        context.sendBroadcast(intent);
    }

    private static String getLauncherClassName(Context context) {

        PackageManager pm = context.getPackageManager();

        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);

        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
        for (ResolveInfo resolveInfo : resolveInfos) {
            String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
            if (pkgName.equalsIgnoreCase(context.getPackageName())) {
                String className = resolveInfo.activityInfo.name;
                return className;
            }
        }
        return null;
    }
}

【讨论】:

  • 嗨,有人知道三星和索尼设备中徽章更新的 min sdk 要求是什么吗?提前致谢。
  • 很棒的工作!希望支持小米、宏基、HTC、摩托罗拉等更多手机
【解决方案3】:

嗯,这很难做到。到目前为止,我发现的唯一方法是创建一个 widget 来处理应用程序图标和徽章。

我强烈建议您访问此页面,您将了解如何实现这一目标: Android: Is it possible to update a ImageView/ImageButton with a number to show the number of new messages?

【讨论】:

  • 嘿,我实际上已经想通了,并想发布我自己的问题的答案,但如果没有 10 名声望,我无法做到这一点......哎呀。 :P 稍后将发布一个指向答案的链接作为评论,并在 8 小时内将其作为答案发布,如果允许的话。
【解决方案4】:

我意识到这个问题已经很老了,但出于历史目的,用于与 Xperia Home API 交互以实现此特定功能的第 3 方应用程序的 API 已于去年公开:

Xperia Home badge API now publicly available

这里有示例代码:

sonyxperiadev/home-badge

还有一个支持大多数主要手机供应商的第 3 方库,包括 Xperia Home API:

leolin310148/ShortcutBadger

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2014-11-09
    相关资源
    最近更新 更多