使用Sony的Xperia Home,某些应用程序可以在应用程序图标上显示计数气泡或徽章。Facebook和Facebook Messenger都可以这样做,内置的电子邮件应用程序也可以。
对于三星的启动器已经解决了此问题,但我没有找到任何有关如何在Sony的启动器上实现的文档。
怎么做呢?
使用Sony的Xperia Home,某些应用程序可以在应用程序图标上显示计数气泡或徽章。Facebook和Facebook Messenger都可以这样做,内置的电子邮件应用程序也可以。
对于三星的启动器已经解决了此问题,但我没有找到任何有关如何在Sony的启动器上实现的文档。
怎么做呢?
在看过了Daniel Ochoa在三星启动器中使用BadgeProvider来处理标记的解决方案之后,我开始尝试为Sony的Xperia Home做同样的事情。这个回答是直接从我的博客中获取的。
我偶然发现了Sony的AppXplore,并用它来检查Facebook应用程序的权限。 Facebook应用程序请求以下权限,这是在Sony设备上显示徽章的关键:
com.sonyericsson.home.permission.BROADCAST_BADGE
接下来,我查看了所有可用的内容提供者,但没有找到与应用程序图标徽章有关的内容。我运行了此答案中的命令来获取系统转储文件,并使用Notepad++搜索“badge”。我找到了这个:
com.sonyericsson.home.action.UPDATE_BADGE: 41be9a90 com.sonyericsson.home/.BadgeService$BadgeReceiver filter 41be9858
所以,在Sony上使用BroadcastReciever来处理它,而不是Samsung的Content Provider。因此,我创建了一个自己的虚拟BroadcastReciever,监听动作com.sonyericsson.home.action.UPDATE_BADGE,并找到了Facebook的BadgeService传递的extra参数。 为此,我还需要一个权限,但在转储文件中很容易找到:
com.sonyericsson.home.permission.RECEIVE_BADGE
由Facebook、电子邮件应用程序等发送的extras是:
因此,在启动器中显示应用程序图标上的徽章非常简单。在我看来,这比对于三星的启动器要简单得多。 以下是一份逐步指南(而且不长!):
在您的清单文件中声明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);
我希望这对某个人有所帮助! :)我在三星、索尼和HTC设备上使用这个类(还可以在https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f找到)。别忘了在 AndroidManifest.xml 中添加 <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
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;
}
}
我知道这个问题已经很老了,但出于历史目的,去年公开了与Xperia Home API交互的第三方应用程序API:
这里有示例代码:
还有一个第三方库,支持大多数主要手机厂商,包括Xperia Home API:
这个有点难做。到目前为止,我找到的唯一方法是创建一个 widget
来处理应用程序图标和徽章。
我强烈建议您访问这个页面,了解如何实现: Android:是否可以使用数字更新 ImageView/ImageButton 以显示新消息的数量?