¿Cómo agregar una insignia de notificación / conteo al ícono de la aplicación en los dispositivos Sony Xperia?

Con Xperia Home de Sony, ciertas aplicaciones tienen la capacidad de mostrar una burbuja o distintivo de conteo en el ícono de la aplicación. Facebook y Facebook Messenger hacen esto, así como la aplicación de correo electrónico integrada.

Esto ha sido resuelto para el lanzador de Samsung , pero no he encontrado ninguna documentación sobre cómo hacerlo para el lanzador de Sony.

¿Cómo puede hacerse esto?

Después de haber visto la solución de Daniel Ochoa para el lanzador de Samsung, que utiliza un BadgeProvider para manejar las insignias, me puse a hacer lo mismo con el Xperia Home de Sony. Esta respuesta se toma directamente de mi blog .

Cómo lo descubrí – Para cualquier persona interesada

Me encontré con AppXplore de Sony y lo usé para verificar los permisos de la aplicación de Facebook. La aplicación de Facebook solicita el siguiente permiso, que es la clave para mostrar las insignias en los dispositivos de Sony:

com.sonyericsson.home.permission.BROADCAST_BADGE

A continuación, eché un vistazo a todos los proveedores de contenido disponibles, pero no encontré nada relacionado con las insignias del icono de la aplicación allí. Ejecuté el comando en esta respuesta para obtener un archivo de volcado del sistema y busqué “insignia” usando Notepad ++. Encontré esto:

com.sonyericsson.home.action.UPDATE_BADGE: 41be9a90 com.sonyericsson.home / .BadgeService $ BadgeReceiver filter 41be9858

Por lo tanto, se maneja utilizando un BroadcastReciever en Sony en lugar de un proveedor de contenido de Samsung. Así que creé un BroadcastReciever ficticio, escuchando la acción com.sonyericsson.home.action.UPDATE_BADGE, y descubrí que los extras se pasaron al BadgeService de Sony. Para esto, también necesitaba un permiso, pero eso fue fácil de encontrar en el archivo de volcado:

com.sonyericsson.home.permission.RECEIVE_BADGE

Los extras enviados por Facebook, la aplicación de correo electrónico, etc. son:

  • com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME : el nombre de la actividad principal de su aplicación, android.intent.action.MAIN. Esto es para que el iniciador sepa en qué icono mostrar la insignia.
  • com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE – un booleano que indica si queremos mostrar la insignia o no (lo que hacemos)
  • com.sonyericsson.home.intent.extra.badge.MESSAGE – una cadena (no un número entero) que me llevó un tiempo darme cuenta …) con el número que se muestra.
  • com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME : el nombre de su paquete de aplicación.

Cómo mostrar insignias en el ícono del iniciador de su aplicación en dispositivos Sony Xperia

Entonces, resulta muy simple mostrar una insignia en el ícono de su aplicación en el iniciador. IMO es mucho más directo que para el lanzador de Samsung. Aquí hay una guía paso a paso (¡y no es larga!)

  1. Declare el permiso com.sonyericsson.home.permission.BROADCAST_BADGE en su archivo de manifiesto:

  2. Transmita una Intent al BadgeReceiver :

     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); 
  3. Hecho. Una vez que se Intent este Intent el iniciador debe mostrar una insignia en el icono de su aplicación.

  4. Para eliminar la insignia nuevamente, simplemente envíe una nueva transmisión, esta vez con SHOW_MESSAGE establecido en falso:

     intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false); 

Bueno saber

¡El mensaje es una cadena!

Como MESSAGE es una String , puedes agregar palabras a la insignia:

 intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "Testing"); 

Pero no haría eso porque parece extraño.

¡Tienes acceso a todas las aplicaciones!

El permiso BROADCAST_BADGE no solo le da acceso al icono de su propia aplicación, sino a TODOS ellos. Por ejemplo, aquí puedes ver cómo puedes configurar la insignia de 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); 

¡Espero que esto haya sido de ayuda para alguien! 🙂

Utilizo esta clase para dispositivos Samsung, Sony y HTC (también disponible https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f ). No olvides agregar a 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 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; } } 

Bueno, esto es bastante difícil de hacer. La única forma que he encontrado hasta ahora es crear un widget que maneje tanto el ícono de la aplicación como la insignia.

Te sugiero que visites esta página donde aprenderás cómo lograrlo: Android: ¿Es posible actualizar ImageView / ImageButton con un número para mostrar la cantidad de mensajes nuevos?

Me doy cuenta de que esta pregunta es bastante antigua, pero para fines históricos, la API para aplicaciones de terceros para interactuar con la API de Xperia Home para esta característica en particular se hizo pública el año pasado:

La API Xperia Home badge ahora está disponible públicamente

Con código de ejemplo aquí:

sonyxperiadev / home-badge

También hay una biblioteca de terceros que admite la mayoría de los principales proveedores de teléfonos, incluida la Xperia Home API:

leolin310148 / ShortcutBadger