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

Mar*_*cus 34 notifications android sony count badge

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

这已经解决了三星的发射器,但我还没有找到任何关于如何为索尼的发射器做这个的文档.

怎么做到呢?

Mar*_*cus 47

在看过Daniel Ochoa的三星发射器解决方案之后,我使用BadgeProvider来处理徽章,我开始为索尼的Xperia Home做同样的事情.这个答案直接来自我的博客.

我怎么想出来的 - 对任何有兴趣的人

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

com.sonyericsson.home.permission.BROADCAST_BADGE

接下来,我浏览了所有可用的内容提供商,但我发现没有任何与应用程序图标徽章相关的信息.我在这个答案中运行命令以获取系统转储文件,并使用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 - 应用程序主要活动的名称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. 广播IntentBadgeReceiver:

    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);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 完成.一旦Intent在广播发射器应显示在您的应用程序图标徽章.

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

    intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
    
    Run Code Online (Sandbox Code Playgroud)

很高兴知道

消息是一个字符串!

既然MESSAGE是a String,您实际上可以在徽章中添加单词:

intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "Testing");
Run Code Online (Sandbox Code Playgroud)

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

您可以访问所有应用!

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);
Run Code Online (Sandbox Code Playgroud)

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


Tad*_*tis 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

63753 次

最近记录:

8 年,3 月 前