![](/img/trans.png)
[英]how to push notification message count on app icon badge in samsung devices
[英]How to add a notification badge/count to application icon on Sony Xperia devices?
在看到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,电子邮件应用程序等发送的额外内容是:
因此,事实证明,在启动器的应用程序图标上显示徽章非常简单。 IMO比三星的发射器更直接。 这是循序渐进的指南(时间不长!)
在清单文件中声明com.sonyericsson.home.permission.BROADCAST_BADGE
权限:
向BadgeReceiver
广播Intent
:
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);
我希望这对某人有所帮助! :)
我将此类用于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;
}
}
好吧,这很难做到。 到目前为止,我发现的唯一方法是创建一个可同时处理应用程序图标和徽章的widget
。
我强烈建议您访问此页面,在那里您将学习如何实现该功能: Android:是否可以用数字更新ImageView / ImageButton以显示新消息的数量?
我意识到这个问题已经很老了,但是出于历史的原因,用于第三方应用程序与Xperia Home API交互以实现此特定功能的API于去年公开:
此处带有示例代码:
还有一个第三方聚会库,它支持大多数主要的电话供应商,包括Xperia Home API:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.