Cómo mostrar el recuento de notificaciones en el icono del lanzador de aplicaciones

Samsung galaxy note 2 versión android 4.1.2

Sé que esta pregunta fue hecha antes y la respuesta no fue posible

Cómo mostrar el contador de globo sobre el icono del lanzador de aplicaciones en android

Sin embargo ayer actualizé la aplicación facebook y empezó a mostrar un contador de mensajes no leídos mensajes privados. ¿Cómo es posible que Facebook app y no pueda hacerlo para mi aplicación?

Icono de facebook

Introduzca aquí la descripción de la imagen

Samsung galaxy note 2 versión android 4.1.2

Android ("vainilla" androide sin lanzadores personalizados e interfaces táctiles) no permite cambiar el icono de la aplicación, porque está sellado en el .apk firmemente una vez que el programa se compila. No hay forma de cambiarlo a un 'dibujable' mediante programación utilizando API estándar. Puede alcanzar su objetivo utilizando un widget en lugar de un icono. Los widgets son personalizables. Por favor, lea esto: http://www.cnet.com/8301-19736_1-10278814-251.html y este http://developer.android.com/guide/topics/appwidgets/index.html . También mira aquí: https://github.com/jgilfelt/android-viewbadger . Puede ayudarle.

En cuanto a los números de insignia. Como he dicho antes, no hay una forma estándar de hacerlo. Pero todos sabemos que Android es un sistema operativo abierto y podemos hacer todo lo que queremos con él, por lo que la única forma de agregar un número de insignia es utilizar algunas aplicaciones de terceros o lanzadores personalizados o el toque frontal Interfaces: Samsung TouchWiz o la interfaz de Sony Xperia. Otras respuestas utilizan esta capacidad y puede buscar esto en stackoverflow, por ejemplo, aquí . Pero voy a repetir una vez más: no hay una API estándar para esto y quiero decir que es una mala práctica. La insignia de notificación de iconos de la aplicación es un patrón de iOS y no debería utilizarse en las aplicaciones de Android de todos modos. En Andrioid hay una notificación de la barra de estado para estos propósitos: http://developer.android.com/guide/topics/ui/notifiers/notifications.html Así que, si Facebook o alguien otro usa esto – no es un patrón común o Tendencia que debemos considerar. Pero si usted insiste de todos modos y no quiere usar widgets pantalla de inicio a continuación, busque aquí, por favor:

¿Cómo agrega Facebook números de insignia en el icono de la aplicación en Android?

Como usted ve esto no es una aplicación de Facebook real es TouchWiz. En Android vainilla esto se puede lograr con Nova Launcher http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.html Así que si usted verá insignias icono en alguna parte, asegúrese de que es Ya sea un lanzador de terceros o una interfaz táctil (frontend wrapper). Puede que alguna vez Google agregue esta capacidad a la API estándar de Android.

Funciona en samsung touchwiz lanzador

 public static void setBadge(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); } public 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; } 

ShortcutBadger es una biblioteca que agrega una capa de abstracción sobre la marca del dispositivo y el lanzador actual y ofrece un gran resultado. Funciona con LG, Sony, Samsung, HTC y otros lanzadores personalizados.

Incluso tiene una manera de mostrar el recuento de insignias en dispositivos de escritorio Pure Android.

Actualizar el recuento de insignias en el icono de la aplicación es tan fácil como llamar:

 int badgeCount = 1; ShortcutBadger.applyCount(context, badgeCount); 

Incluye una aplicación de demostración que le permite probar su comportamiento.

He descubierto cómo se hace esto para los dispositivos de Sony.

He publicado un blog sobre esto aquí . También he publicado un seperate SO pregunta sobre esto aquí .


Los dispositivos de Sony utilizan una clase llamada BadgeReciever .

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

  2. Difundir una Intent a la 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 transmita esta Intent el lanzador debe mostrar una insignia en el icono de la aplicación.

  4. Para quitar la insignia de nuevo, simplemente envíe una nueva emisión, esta vez con SHOW_MESSAGE establecido en false:

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

He excluido detalles sobre cómo encontré esto para mantener la respuesta breve, pero todo está disponible en el blog. Podría ser una lectura interesante para alguien.

Esta es la muestra y la mejor manera de mostrar la insignia en el icono del lanzador de notificaciones.

Agregue esta clase en su aplicación

 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; } } 

==> MyGcmListenerService.java Utiliza la clase BadgeUtils cuando llega la notificación.

 public class MyGcmListenerService extends GcmListenerService { private static final String TAG = "MyGcmListenerService"; @Override public void onMessageReceived(String from, Bundle data) { String message = data.getString("Msg"); String Type = data.getString("Type"); Intent intent = new Intent(this, SplashActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.BigTextStyle bigTextStyle= new NotificationCompat.BigTextStyle(); bigTextStyle .setBigContentTitle(getString(R.string.app_name)) .bigText(message); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(getNotificationIcon()) .setContentTitle(getString(R.string.app_name)) .setContentText(message) .setStyle(bigTextStyle) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); int color = getResources().getColor(R.color.appColor); notificationBuilder.setColor(color); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); int unOpenCount=AppUtill.getPreferenceInt("NOTICOUNT",this); unOpenCount=unOpenCount+1; AppUtill.savePreferenceLong("NOTICOUNT",unOpenCount,this); notificationManager.notify(unOpenCount /* ID of notification */, notificationBuilder.build()); // This is for bladge on home icon BadgeUtils.setBadge(MyGcmListenerService.this,(int)unOpenCount); } private int getNotificationIcon() { boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP); return useWhiteIcon ? R.drawable.notification_small_icon : R.drawable.icon_launcher; } } 

Y la notificación clara de preferencia y también con el recuento de la insignia

  public class SplashActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); AppUtill.savePreferenceLong("NOTICOUNT",0,this); BadgeUtils.clearBadge(this); } } 
 <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> 
  • Icono contador en android
  • Android: Notificaciones push de GCM que no aparecen en la lista de notificaciones
  • ¿Por qué los iconos establecidos con Notification.Builder.setSmallIcon en Android Lollipop muestran como un cuadrado blanco?
  • ¿Cómo iniciar la actividad cuando el usuario hace clic en una notificación?
  • ContentObservers son inútiles
  • ¿Cómo algunas aplicaciones bloquean / reemplazan notificaciones de heads-up?
  • Android: varias notificaciones como lista única en la barra de estado
  • El icono de notificación de Lollipop es demasiado pequeño
  • Android - administrador de notificaciones, tener una notificación sin intención
  • Notificación de baja energía del bluetooth
  • ¿Puedo anular el icono predeterminado de notificación push en android desde el icono de la aplicación hasta el icono personalizado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.