在android应用程序图标上添加通知徽章

在android应用程序图标上添加通知徽章,android,user-interface,icons,badge,Android,User Interface,Icons,Badge,你可能认为这是一个重复的问题,但我希望答案比任何类似的问题更具体 首先,它说,就像facebook有三星设备的通知徽章一样。 . 结果是touchwiz启动器,它可能是三星设备的默认启动器。当我尝试用nova launcher测试我的三星设备时。它需要安装一些第三方软件或Nova TestlaUnread 事实是这样的。我以为touchWiz正在为所有应用程序添加徽章,但当我尝试使用我的应用程序进行测试以获得一些通知时,它没有显示任何徽章。我发现三星TouchWiz仅向所选应用程序显示应用程序,

你可能认为这是一个重复的问题,但我希望答案比任何类似的问题更具体

首先,它说,就像facebook有三星设备的通知徽章一样。 . 结果是touchwiz启动器,它可能是三星设备的默认启动器。当我尝试用nova launcher测试我的三星设备时。它需要安装一些第三方软件或Nova TestlaUnread

事实是这样的。我以为touchWiz正在为所有应用程序添加徽章,但当我尝试使用我的应用程序进行测试以获得一些通知时,它没有显示任何徽章。我发现三星TouchWiz仅向所选应用程序显示应用程序,如下所述:

问题是:有没有办法让touchWiz知道如何在我的应用图标上添加徽章?
这是三星的设备

根据之前的观点,似乎是不同供应商的发起者负责android应用程序中的徽章图标。索尼Experia使用Experia Home/Launcher作为默认启动器。在我的索尼设备里,他们有一些徽章在里面,比如短信、未接来电或facebook

问题是:像上一个问题一样,有没有办法让experia home知道如何在我的应用图标上添加徽章?

因为我在想,与启动器交互似乎是“将徽章添加到应用程序图标”的解决方案

关于这个活动别名和不时更改应用程序图标,有一个解决方案,我认为这是垃圾。

所以我正在寻找与特定于供应商的启动器交互的解决方案

“任何解决方案都将受到欢迎,即使我会在android中深入使用本机开发”


提前感谢

除了丹尼尔·奥乔亚(Daniel Ochoa)为三星(Samsung)提供的解决方案(参见评论),我已经了解了索尼设备是如何做到这一点的

我在博客上写过。我还发布了一个单独的SO问题


索尼设备使用名为
BadgeReceiver
的类

  • 在清单文件中声明
    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);
    

  • 我已经排除了关于我是如何找到这个的细节,以保持答案的简短,但这些都可以在博客上找到。对某些人来说可能是一本有趣的书。

    我在三星和索尼设备上使用这个类(也可以使用)。不要忘记将
    添加到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.sonyericsson.home.intent.extra.badge.MESSAGE”,String.valueOf(0));
    intent.putExtra(“com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME”,context.getPackageName());
    发送广播(意图);
    }
    私有静态字符串getLauncherClassName(上下文){
    PackageManager pm=context.getPackageManager();
    意向意向=新意向(意向.行动\主要);
    intent.addCategory(intent.CATEGORY_启动器);
    List resolveInfos=pm.querytentActivities(intent,0);
    for(ResolveInfo ResolveInfo:resolveInfos){
    字符串pkgName=resolveInfo.activityInfo.applicationInfo.packageName;
    if(pkgName.equalsIgnoreCase(context.getPackageName()){
    字符串className=resolveInfo.activityInfo.name;
    返回类名;
    }
    }
    返回null;
    }
    }
    
    是的,我已经在这里写了一个可能的副本,因为这个问题没有答案,你也没有代表,我不会标记这个(我已经得到了你的答案