繁体   English   中英

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

[英]How to add a notification badge/count to application icon on Sony Xperia devices?

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

三星的启动器解决了问题 ,但我还没有找到有关如何为索尼的启动器执行此操作的任何文档。

如何做呢?

在看到Daniel Ochoa针对三星发射器的解决方案后,该解决方案使用BadgeProvider来处理徽章,我开始对Sony的Xperia Home进行相同的处理。 这个答案直接取自我的博客

我怎么知道的-对于任何有兴趣的人

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

com.sonyericsson.home.permission.BROADCAST_BADGE

接下来,我浏览了所有可用的内容提供商,但没有发现与应用程序图标徽章相关的内容 在此答案中运行了命令以获取系统转储文件,并使用Notepad ++搜索了“徽章”。 我找到了这个:

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

因此,它是在Sony而不是三星的Content Provider上使用BroadcastReciever处理的。 因此,我创建了一个自己的虚拟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. 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); 
  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);

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

我将此类用于Samsung,Sony和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;
    }
}

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

我强烈建议您访问此页面,在那里您将学习如何实现该功能: Android:是否可以用数字更新ImageView / ImageButton以显示新消息的数量?

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

Xperia Home徽章API现已公开可用

此处带有示例代码:

sonyxperiadev /家庭徽章

还有一个第三方聚会库,它支持大多数主要的电话供应商,包括Xperia Home API:

leolin310148 /快捷键Badger

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM