Comment effacer une notification dans Android

97

Est-il possible d'effacer une notification par programme?

Je l'ai essayé avec NotificationManagermais ça ne marche pas. Y a-t-il une autre façon de le faire?

rahul
la source
12
Il est possible d'effacer vos propres notifications mais pas celles de quelqu'un d'autre
Donal Rafferty
1
Oui d'accord avec Donal pour un morceau de code voir androidtrainningcenter.blogspot.in/2013/04
...
Consultez cette réponse pour savoir comment effacer les autres notifications pour l'API> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

Réponses:

227

Utilisez le code suivant pour annuler une notification:

NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFICATION_ID);

Dans ce code, il y a toujours le même identifiant utilisé pour les notifications. Si vous avez différentes notifications qui doivent être annulées, vous devez enregistrer les identifiants que vous avez utilisés pour créer la notification.

Janusz
la source
9
Je ne sais pas pourquoi ce n'est pas plus voté et choisi comme réponse. C'était la solution que je recherchais. Merci!
loeschg
3
Quel devrait être l'identifiant de notification ici?
Deepak
Cela fonctionne en effet. Mais une fois que j'annule une notification, toutes les notifications suivantes n'affichent pas le texte du message de notification (que j'ai défini en utilisant setContentText) bien que j'aie défini la priorité sur 2. Des suggestions?
Iqbal
Ne fonctionne pas si l'indicateur de notification est défini sur Notification.FLAG_NO_CLEAR
Anand Savjani
2
pour tous et si vous ne savez pas quel id, if (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet
42

De: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Pour effacer la notification de la barre d'état lorsque l'utilisateur la sélectionne dans la fenêtre Notifications, ajoutez l'indicateur "FLAG_AUTO_CANCEL" à votre objet Notification. Vous pouvez également l'effacer manuellement avec cancel (int), en lui passant l'ID de notification ou effacer toutes vos notifications avec cancelAll ().

Mais Donal a raison, vous ne pouvez effacer que les notifications que vous avez créées.

Chuck C.
la source
11
Cela n'annulera pas une notification par programme.
Janusz
4
Je ne sais pas de quoi parle Janusz mais annuler (id) et cancelAll () fonctionnent certainement
Andrew G
32

Puisque personne n'a publié de code de réponse à cela:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. et si vous avez déjà des indicateurs, vous pouvez OU FLAG_AUTO_CANCEL comme ceci:

notification.flags = Notification.FLAG_INSISTENT | Notification.FLAG_AUTO_CANCEL;
NPike
la source
4
C'est mieux de cette façon:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Sebastian Nowak
Quelqu'un pourrait-il expliquer pourquoi c'est mieux ainsi?
Prof
@Prof C'est moins de code dans le même but et n'a aucun impact sur les performances.
Denny
1
@Denny Cela suppose que le premier indicateur de notification est défini ci-dessus, donc il s'agit de deux lignes au lieu d'une ligne
Prof
21

Veuillez essayer la méthode par défaut fournie dans NotificationManager .

NotificationManager.cancelAll()pour supprimer toutes les notifications. NotificationManager.cancel(notificationId)pour supprimer une notification particulière.

Rohit Suthar
la source
1
Si quelqu'un reste bloqué sur NotificationManager sans cancelméthode, la cancelméthode n'est pas statique, vous avez donc besoin d'une instance NotificationManagercomme celle-ci: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Vous pouvez alors appeler notificationManager.cancel(notificationId);comme Rohit Suthar référencé dans sa réponse. notificationIdest simplement l'ID que vous avez transmisnotificationManager.notify(notificationId, mNotification)
Mira_Cole
8

À partir du niveau d'API 18 (Jellybean MR2), vous pouvez annuler les notifications autres que les vôtres via NotificationListenerService.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class MyNotificationListenerService extends NotificationListenerService {...}

...

private void clearNotificationExample(StatusBarNotification sbn) {
    myNotificationListenerService.cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
Jim Vitek
la source
5
 Notification mNotification = new Notification.Builder(this)

                .setContentTitle("A message from: " + fromUser)
                .setContentText(msg)
                .setAutoCancel(true)
                .setSmallIcon(R.drawable.app_icon)
                .setContentIntent(pIntent)
                .build();

.setAutoCancel (vrai)

lorsque vous cliquez sur la notification, ouvrez l'activité correspondante et supprimez la notification de la barre de notification

Neeraj Singh
la source
4

Si vous générez une notification à partir d'un service démarré au premier plan à l'aide de

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Puis émettre

notificationManager.cancel(NOTIFICATION_ID);

ne finit pas par annuler la notification et la notification apparaît toujours dans la barre d'état. Dans ce cas particulier, vous devrez émettre

stopForeground( true );

depuis le service pour le remettre en arrière-plan et pour annuler simultanément les notifications. Vous pouvez également le pousser en arrière-plan sans qu'il annule la notification, puis annuler la notification.

stopForeground( false );
notificationManager.cancel(NOTIFICATION_ID);
Ian Gough
la source
3

Si vous utilisez NotificationCompat.Builder(une partie de android.support.v4), appelez simplement la méthode de son objetsetAutoCancel

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setAutoCancel(true);

Certains types signalaient que setAutoCancel()cela ne fonctionnait pas pour eux, vous pouvez donc essayer de cette façon également

builder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;

Notez que la méthode getNotification()est obsolète !!!

sandalone
la source
La question demandait comment l'effacer par programme. setAutoCancel () l'efface lorsque l'utilisateur clique sur la notification. developer.android.com/reference/android/support/v4/app/…
S Fitz
@SFitz Il n'est pas clair d'après la question ce qu'il veut. J'ai compris qu'il souhaite effacer la notification lorsqu'un utilisateur clique dessus.
sandalone
1
    // Get a notification builder that's compatible with platform versions
    // >= 4
    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            this);
    builder.setSound(soundUri);
    builder.setAutoCancel(true);

cela fonctionne si vous utilisez un générateur de notification ...

user2962552
la source
1

En fait, comme répondu avant de commencer avec le niveau d'API 18, vous pouvez annuler les notifications publiées par d'autres applications différentes de la vôtre en utilisant NotificationListenerService, mais cette approche ne fonctionnera plus sur Lollipop, voici le moyen de supprimer les notifications couvrant également l'API Lillipop.

if (Build.VERSION.SDK_INT < 21) {
    cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
else {
    cancelNotification(sbn.getKey());
}
Alejandro Casanova
la source
Je ne trouve pas la méthode cancelNotificationqu'est-ce que c'est?
Denny
C'est une méthode de la classe NotificationListenerService, veuillez consulter la documentation officielle developer.android.com/reference/android/service/notification/…
Alejandro Casanova
Comment puis-je l'utiliser en dehors du service?
Denny
0

Toutes les notifications (même les autres notifications d'application) peuvent être supprimées en écoutant 'NotificationListenerService' comme mentionné dans l' implémentation NotificationListenerService

Dans le service, vous devez appeler cancelAllNotifications().

Le service doit être activé pour votre application via:

«Applications et notifications» -> «Accès spécial aux applications» -> «Accès aux notifications».

Samantha
la source
0

ce code a fonctionné pour moi:

public class ExampleReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

    int notificationId = 1;
    notificationManager.cancel(notificationId);
  }
}
Wilson
la source
0

Je crois que le plus RÉCENT et MIS À JOUR pour AndroidX et la compatibilité descendante. La meilleure façon de faire (Kotlin et Java) devrait être la suivante:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Ou pour annuler toutes les notifications, c'est:

NotificationManagerCompat.from(context).cancelAll()

Conçu pour AndroidX ou les bibliothèques de support.

Xénolion
la source