如何在Sony Xperia设备上为应用程序图标添加通知徽章/计数?

时间:2013-11-26 12:13:52

标签: android count notifications badge sony

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

这已经是solved for Samsung's launcher,但我没有找到任何关于如何为索尼发射器做这件事的文档。

怎么做?

4 个答案:

答案 0 :(得分:47)

在看过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获取系统转储文件,并使用Notepad ++搜索“徽章”。我发现了这个:

  

com.sonyericsson.home.action.UPDATE_BADGE:   41be9a90 com.sonyericsson.home / .BadgeService $ BadgeReceiver filter 41be9858

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

  

com.sonyericsson.home.permission.RECEIVE_BADGE

Facebook,电子邮件应用程序等发送的附加内容包括:

  • com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME - The 应用程序主要活动的名称android.intent.action.MAIN。这是 所以启动器知道哪个图标显示徽章。
  • com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE - a boolean指示我们是否要显示徽章(我们这样做!)
  • 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);
    

  5. 很高兴知道

    消息是一个字符串!

    由于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);
    

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

答案 1 :(得分:29)

我将此类用于三星,索尼和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;
    }
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我意识到这个问题已经过时了,但出于历史考虑,第三方应用程序与Xperia Home API进行交互的API已于去年公布:

Xperia Home badge API now publicly available

这里有示例代码:

sonyxperiadev/home-badge

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

leolin310148/ShortcutBadger