如何与三星手机上的BadgeProvider进行交互,以将计数添加到应用图标?

三星的TWLauncher允许应用程序在应用程序图标上创build徽章数量。

这完全没有文件! 没有任何地方提及它,只有less数应用程序正在使用它(例如Facebook,eBay)。

你如何使用这个function来添加一个计数到你的应用程序图标?

首先,您需要将以下权限添加到您的AndroidManifest.xml文件中。

<uses-permission android:name="com.sec.android.provider.badge.permission.READ" /> <uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" /> 

列结构如下:

 (integer) _id, (text) package, (text) class, (integer) badgecount, (blob) icon, (???) extraData 

为了查询来自BadgeProvider的所有结果,请执行以下操作:

 // This is the content uri for the BadgeProvider Uri uri = Uri.parse("content://com.sec.badge/apps"); Cursor c = getContentResolver().query(uri, null, null, null, null); // This indicates the provider doesn't exist and you probably aren't running // on a Samsung phone running TWLauncher. This has to be outside of try/finally block if (c == null) { return; } try { if (!c.moveToFirst()) { // No results. Nothing to query return; } c.moveToPosition(-1); while (c.moveToNext()) { String pkg = c.getString(1); String clazz = c.getString(2); int badgeCount = c.getInt(3); Log.d("BadgeTest", "package: " + pkg + ", class: " + clazz + ", count: " + String.valueOf(cnt)); } } finally { c.close(); } 

为了将徽章计数添加到您的应用程序图标

 ContentValues cv = new ContentValues(); cv.put("package", getPackageName()); // Name of your activity declared in the manifest as android.intent.action.MAIN. // Must be fully qualified name as shown below cv.put("class", "com.example.badge.activity.Test"); cv.put("badgecount", 1); // integer count you want to display // Execute insert getContentResolver().insert(Uri.parse("content://com.sec.badge/apps"), cv); 

如果你想清除你的图标上的徽章数量

 ContentValues cv = new ContentValues(); cv.put("badgecount", 0); getContentResolver().update(Uri.parse("content://com.sec.badge/apps"), cv, "package=?", new String[] {getPackageName()}); 


我已经创build了一个开源项目,您可以导入为一个库来协助这个项目。 它被许可为Apache,因此可以随意使用它。

你可以从这里得到它: https : //github.com/shafty023/SamsungBadger

还有另一个很酷的开源库支持不同的设备: https : //github.com/leolin310148/ShortcutBadger/

将这些权限添加到清单

 <!--for android badge--> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/> <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS"/> <!--for Samsung badge--> <uses-permission android:name="com.sec.android.provider.badge.permission.READ"/> <uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/> <!--for htc badge--> <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS"/> <uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT"/> <!--for sony badge--> <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE"/> <!--for apex badge--> <uses-permission android:name="com.anddoes.launcher.permission.UPDATE_COUNT"/> 

将这些包名称添加到您的类:

  final String HOME_PACKAGE_SONY = "com.sonyericsson.home"; final String HOME_PACKAGE_SAMSUNG = "com.sec.android.app.launcher"; final String HOME_PACKAGE_LG = "com.lge.launcher2"; final String HOME_PACKAGE_HTC = "com.htc.launcher"; final String HOME_PACKAGE_ANDROID = "com.android.launcher"; final String HOME_PACKAGE_APEX = "com.anddoes.launcher"; final String HOME_PACKAGE_ADW = "org.adw.launcher"; final String HOME_PACKAGE_ADW_EX = "org.adwfreak.launcher"; final String HOME_PACKAGE_NOVA = "com.teslacoilsw.launcher"; 

用来 :

  // just put your pachage and main activity class path String classPath = "ir.faasaa.resa.MainActivity"; ContentValues cv = new ContentValues(); cv.put("package", context.getPackageName()); cv.put("class", classPath); cv.put("badgecount", count); context.getContentResolver().insert(Uri.parse(HOME_PACKAGE_SAMSUNG), cv); 

感谢ShortcutBadger

在Android中,我们没有像iOS那样的徽章风格方法,但一些制造商正在支持在应用程序图标上显示徽章。

支持索尼和HTC。

Android上应用程序中徽章样式图标的示例

索尼和HTC支持添加徽章到应用程序图标。

对于索尼

 <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> Intent intent= new Intent("com.sonyericsson.home.action.UPDATE_BADGE"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", Class Name); intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true); intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE",number); intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", packageName); sendBroadcast(intent); 

对于HTC:

 <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT" /> Intent updateIntent = new Intent("com.htc.launcher.action.UPDATE_SHORTCUT"); updateIntent.putExtra("packagename", packageName); updateIntent.putExtra("count", number); this.sendBroadcast(updateIntent); Intent setNotificationIntent = new Intent("com.htc.launcher.action.SET_NOTIFICATION"); ComponentName localComponentName = new ComponentName(packageName, className); setNotificationIntent.putExtra("com.htc.launcher.extra.COMPONENT", localComponentName.flattenToShortString()); setNotificationIntent.putExtra("com.htc.launcher.extra.COUNT", number); this.sendBroadcast(setNotificationIntent); 

我使用这个类的三星和索尼设备(也可用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设备

 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.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "10"); 

更多细节如下

http://www.marcusforsberg.net/blog/android-notification-badge-app-icon-sony/