为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

POPMUISE 2019-12-13 15:10:36

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


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


如何做呢?


查看完整描述

3 回答

?
湖上湖

在看到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比三星的发射器更直接。这是循序渐进的指南(时间不长!)


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


广播一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);

做完了 一旦Intent在广播发射器应显示在您的应用程序图标徽章。


要再次删除徽章,只需发送新的广播,这次将其SHOW_MESSAGE设置为false:


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

很高兴知道

消息是字符串!

由于MESSAGE是String,您实际上可以在徽标中添加单词:


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

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



查看完整回答
反对 回复 2019-12-14
?
潇潇雨雨

我将此类用于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;

    }

}



查看完整回答
反对 回复 2019-12-14
?
吃鸡游戏

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


Xperia Home徽章API现已公开可用


此处带有示例代码:


sonyxperiadev /家庭徽章


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


leolin310148 /快捷键Badger



查看完整回答
反对 回复 2019-12-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信