¿Cómo verificar qué notificaciones están activas en la barra de estado en Android Dev?

Creé una aplicación que establece notificaciones en la barra de estado desplegable de los teléfonos con Android. Sin embargo, hay un error en mi código (a veces las notificaciones se establecen, a veces no). Quiero poder CHECK (en el código) SI LA NOTIFICACIÓN ES VISIBLE PARA EL USUARIO. (es decir, ¿puede el usuario ver la notificación en la barra de estado?).

¿Cómo puedo hacer esto? (Gracias por adelantado).

El código de muestra es muy apreciado.

Quiero poder CHECK (en el código) SI LA NOTIFICACIÓN ES VISIBLE PARA EL USUARIO. (es decir, ¿puede el usuario ver la notificación en la barra de estado?).

¿Cómo puedo hacer esto?

No puedes, lo siento. Actualización: ahora es posible con Android 4.3+ http://developer.android.com/reference/android/service/notification/NotificationListenerService.html#getActiveNotifications ()

Sin embargo, siempre puedes simplemente cancel() : cancelar una Notification que no está en pantalla está perfectamente bien. Por el contrario, siempre puede llamar a notify() forma segura para la misma Notification , y tampoco causará problemas si la Notification ya está en pantalla.

EDITAR:

NotificationManager.getActiveNotifications () se agregó en API 23 si no desea utilizar el NotificationListenerService

Solo para poner todo junto. Así es como funciona

Para construir una notificación,

  Notification n = new Notification.Builder(MyService.this) .setContentTitle("Notification Title") .setContentText("Notification Message") .setSmallIcon(R.drawable.myicon).build(); 

Para hacer una notificación de sonido, llame a setSound() de Notificación,

  Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); Notification n = new Notification.Builder(MyService.this) .setContentTitle("Notification Title") .setContentText("Notification Message") .setSound(alarmSound) .setSmallIcon(R.drawable.myicon).build(); 

Para cancelar la notificación después de que el usuario haya seleccionado y lanzado el receptor Intención, llame a setAutoCancel() ,

  Notification n = new Notification.Builder(MyService.this) .setContentTitle("Notification Title") .setContentText("Notification Message") .setSound(alarmSound) .setAutoCancel(true) .setSmallIcon(R.drawable.myicon).build(); 

Para hacer que el sonido / vibre solo una vez para una notificación particular, use Notification.FLAG_ONLY_ALERT_ONCE . Con esta bandera, su notificación emitirá un sonido solo una vez hasta que se cancele y puede llamar a notify () tantas veces como lo desee con la identificación de la notificación. Tenga en cuenta que si llama a cancelar () o si el usuario cancela la notificación o se cancela automáticamente, notificar () hará que la notificación vuelva a sonar.

  n.flags |= Notification.FLAG_ONLY_ALERT_ONCE; // Dont vibrate or make notification sound 

Finalmente para poner la notificación en el panel de notificaciones,

  NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(notification_id, n); 

Tenga en cuenta que notification_id aquí es importante si desea utilizar la notificación de manera efectiva (para mantener un solo sonido / vibración para una notificación o para cancelar una notificación específica).

Para cancelar una notificación particular,

  NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.cancel(notification_id); 

Puede cancel() una notificación incluso si no existe o puede llamar a notify() tantas veces como desee con la misma ID. Tenga en cuenta que llamar notificar con una ID diferente creará nuevas notificaciones.

Por lo tanto, independientemente de si la notificación existe o no, si vuelve notify() llamar a notify() con el notification_id correcto con el indicador Notification.FLAG_ONLY_ALERT_ONCE establecido, puede mantener su notificación activa sin molestar al usuario con sonidos repetidos.

Debe establecer una identificación para cada notificación que realice.

entonces haces una notificación ..

 PendingIntent pendingIntent = PendingIntent.getBroadcast(this, notId + selectedPosition, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis() - offset, pendingIntent); Notification notification = new Notification(R.drawable.icon, "TVGuide Υπενθύμιση", System.currentTimeMillis()); NotificationManager manger = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); notification.setLatestEventInfo(context, "Κανάλι: " + b.getString("channel"), "Εκπομπή: " + showname, pendingIntent); manger.notify(notId, notification); 

para limpiarlo …

 PendingIntent pendingIntent = PendingIntent.getBroadcast(context,notId, intent, 0); pendingIntent.cancel(); 

y para verificar si está activo … (existAlarm devuelve nulo si no hay intención pendiente disponible)

  public PendingIntent existAlarm(int id) { Intent intent = new Intent(this, alarmreceiver.class); intent.setAction(Intent.ACTION_VIEW); PendingIntent test = PendingIntent.getBroadcast(this, id + selectedPosition, intent, PendingIntent.FLAG_NO_CREATE); return test; } 

Así que todo se reduce para inicializar una identificación para cada notificación y cómo la hace única.

Se introduce un nuevo método en la clase NotificationManager en API 23:

 public StatusBarNotification[] getActiveNotifications() 

Ahora es posible verificar las notificaciones pendientes en Android 4.3 hacia arriba

Mira aquí:

http://developer.android.com/reference/android/service/notification/NotificationListenerService.html#getActiveNotifications ()

Existe una bandera para eso.

 Notification notification = new Notification(icon, tickerText, when); notification.flags |= Notification.FLAG_ONLY_ALERT_ONCE; 

FLAG_ONLY_ALERT_ONCE:

… debe establecerse si desea reproducir el sonido y / o la vibración cada vez que se envía la notificación, incluso si no se ha cancelado antes.

Aunque, la notificación parpadeará cuando se envíe nuevamente, pero no habrá sonido o vibración.

Parece que desde Android M (API 23) es posible obtener su proceso así, sin usar NotificationListenerService ni requerir permisos adicionales:

notificationManager.getActiveNotifications()

A partir de Android Marshmallow (API 23), puede recuperar una lista de notificaciones activas publicadas por su aplicación. Este método de NotificationManager es getActiveNotifications() . Más información aquí: https://developer.android.com/reference/android/app/NotificationManager.html#getActiveNotifications ()