Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Sony Xperia设备上向应用程序图标添加通知徽章/计数?_Android_Count_Notifications_Badge_Sony - Fatal编程技术网

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

Android 如何在Sony Xperia设备上向应用程序图标添加通知徽章/计数?,android,count,notifications,badge,sony,Android,Count,Notifications,Badge,Sony,有了索尼的Xperia Home,某些应用程序可以在应用程序图标上显示计数气泡或徽章。Facebook和Facebook Messenger都能做到这一点,还有内置的电子邮件应用程序 这一直是,但我没有遇到任何文件,如何做到这一点,索尼的发射器 怎么做呢?嗯,这很难做到。到目前为止,我找到的唯一方法是创建一个小部件,它将同时处理应用程序图标和徽章 我强烈建议您访问此页面,从中您将了解如何实现: 看过丹尼尔·奥乔亚(Daniel Ochoa)为三星launcher提供的解决方案后,我开始为索尼的X

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

这一直是,但我没有遇到任何文件,如何做到这一点,索尼的发射器


怎么做呢?

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

我强烈建议您访问此页面,从中您将了解如何实现:

看过丹尼尔·奥乔亚(Daniel Ochoa)为三星launcher提供的解决方案后,我开始为索尼的Xperia Home做同样的事情。这个答案是直接得出的

我是怎么想出来的-对任何感兴趣的人来说 我偶然发现并用它查看了Facebook应用程序的许可。 Facebook应用程序请求以下权限,这是在索尼设备上显示徽章的关键:

com.sonyericsson.home.permission.BROADCAST_徽章

接下来,我看了一遍,但没有发现与应用图标徽章相关的内容。 我运行了获取系统转储文件的命令,并使用Notepad++搜索“badge”。我发现:

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

所以,它是用索尼的广播接收器来处理的,而不是三星的内容提供商。因此,我创建了一个自己的虚拟广播接收器,监听action com.sonyericsson.home.action.UPDATE_徽章,并找到了传递给索尼徽章服务的额外内容。 为此,我还需要权限,但在转储文件中很容易找到:

com.sonyericsson.home.permission.RECEIVE_徽章

Facebook、电子邮件应用程序等发送的额外信息包括:

  • com.sonyericsson.home.intent.extra.badge.ACTIVITY\u名称- 应用程序主要活动的名称,android.intent.action.main。这是 因此启动器知道在哪个图标上显示徽章
  • com.sonyericsson.home.intent.extra.badge.SHOW_消息-a 布尔值,指示是否要显示徽章(我们会这样做!)
  • com.sonyericsson.home.intent.extra.badge.MESSAGE-字符串 (不是整数-我花了一段时间才意识到…)与数字有关 展示
  • com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME-应用程序包的名称

如何在Sony Xperia设备上显示应用程序启动图标上的徽章 因此,在启动器中的应用程序图标上显示徽章非常简单。依我看,这比三星的发射器更直接。 这是一个循序渐进的指南(并不长!)

  • 在清单文件中声明
    com.sonyericsson.home.permission.BROADCAST\u徽章
    权限:
    

  • 意图
    广播到
    接收器

    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\u MESSAGE
    设置为false:

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

  • 很高兴知道 消息是一个字符串! 由于
    消息
    是一个
    字符串
    ,因此您实际上可以向徽章添加单词:

    intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "Testing");
    
    但我不会那样做,因为这看起来很奇怪

    您可以访问所有应用程序!
    BROADCAST_徽章
    权限不仅允许您访问自己的应用程序图标,还允许您访问所有应用程序图标。例如,以下是设置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);
    


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

    我将该类用于三星、索尼和HTC设备(也可提供)。不要忘记将
    添加到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;
        }
    }
    
    公共类BadgeUtils{
    公共静态void setBadge(上下文,int计数){
    setBadgeSamsung(上下文,计数);
    挫折(上下文、计数);
    }
    公共静态无效clearBadge(上下文){
    setBadgeSamsung(上下文,0);
    ClearBadge(上下文);
    }
    私有静态void setBadgeSamsung(上下文上下文,int计数){
    字符串launcherClassName=getLauncherClassName(上下文);
    如果(launcherClassName==null){
    回来
    }
    意向意向=新意向(“android.Intent.action.BADGE\u COUNT\u UPDATE”);
    意图。额外(“徽章计数”,计数);
    intent.putExtra(“badge\u count\u package\u name”,context.getPackageName());
    intent.putExtra(“徽章\计数\类别\名称”,启动器类别名称);
    发送广播(意图);
    }
    私有静态void setBadgeSony(上下文,int计数){
    字符串launcherClassName=getLauncherClassName(上下文);
    如果(launcherClassName==null){
    回来
    }
    意图=新意图();
    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());
    发送广播(意图);
    }
    私有静态无效clearBadgeSony(上下文){
    字符串launcherClassName=getLauncherClassName(上下文);
    如果(launcherClassName==null){
    回来
    }
    意图=新意图();
    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.so