在android应用程序图标上添加通知徽章
你可能认为这是一个重复的问题,但我希望答案比任何类似的问题更具体 首先,它说,就像facebook有三星设备的通知徽章一样。 . 结果是touchwiz启动器,它可能是三星设备的默认启动器。当我尝试用nova launcher测试我的三星设备时。它需要安装一些第三方软件或Nova TestlaUnread 事实是这样的。我以为touchWiz正在为所有应用程序添加徽章,但当我尝试使用我的应用程序进行测试以获得一些通知时,它没有显示任何徽章。我发现三星TouchWiz仅向所选应用程序显示应用程序,如下所述:在android应用程序图标上添加通知徽章,android,user-interface,icons,badge,Android,User Interface,Icons,Badge,你可能认为这是一个重复的问题,但我希望答案比任何类似的问题更具体 首先,它说,就像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;
}
}
是的,我已经在这里写了一个可能的副本,因为这个问题没有答案,你也没有代表,我不会标记这个(我已经得到了你的答案