首页 文章

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

提问于
浏览
33

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

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

怎么做到呢?

4 回答

  • 46

    在看过使用BadgeProvider处理徽章的Daniel Ochoa 's solution for Samsung' s Launcher 之后,我开始为索尼的Xperia Home做同样的事情 . 这个答案是直接from my blog .

    我怎么弄清楚 - 对任何有兴趣的人

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

    com.sonyericsson.home.permission.BROADCAST_BADGE

    接下来,我看了all available content providers但是我发现那里没有与app图标徽章相关的内容 . 我运行command in this answer来获取系统转储文件并使用记事本搜索"badge" . 我找到了这个:

    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 - 应用程序主要活动的名称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比三星的 Launcher 要简单得多 . 这是一个循序渐进的指南(而且不长!)

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

    • BadgeReceiver 广播 Intent

    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);
    
    • 完成 . 广播后,启动器应在应用程序图标上显示徽章 .

    • 要再次删除徽章,只需发送一个新广播,这次将 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 权限不仅可以让您访问自己的应用程序's icon, but to ALL of them. For example, here' s如何设置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);
    

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

  • 0

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

    嗯,这很难做到 . 到目前为止,我找到的唯一方法是创建一个 widget ,它将同时处理应用程序图标和徽章 .

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

  • 0

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

    Xperia Home badge API now publicly available

    这里有示例代码:

    sonyxperiadev/home-badge

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

    leolin310148/ShortcutBadger

相关问题