web-dev-qa-db-fra.com

Désactiver le son de NotificationChannel

Aujourd'hui, j'ai commencé à cibler l'API 26 qui m'a obligé à utiliser les canaux de notification.

Mon problème est que maintenant à chaque nouvelle notification (y compris les mises à jour), un son gênant est joué.

Comment puis-je désactiver ce son?

J'ai essayé de remplacer ce son par un son mp3 personnalisé pour pouvoir ensuite passer un mp3 avec silence, mais ceci est ignoré.

J'ajoute simplement une notification dont la priorité est très basse, donnant essentiellement à l'utilisateur la possibilité d'effectuer certaines actions après avoir interagi avec l'application. Il n'y a aucune raison d'être fort, l'utilisateur saura qu'il peut se référer à la notification, car il a fait quelque chose avec l'application, ce qui entraînera l'apparition d'une notification.

L'utilisateur va vraiment commencer à être ennuyé par ce son.

47
Daniel F

La solution consiste à utiliser NotificationManager.IMPORTANCE_LOW et à créer un nouveau canal pour celui-ci. Une fois qu'un canal est créé, vous ne pouvez pas changer d'importance (enfin, vous le pouvez, mais la nouvelle importance est ignorée). Les informations sur le canal semblent être définitivement stockées par le système et tout canal créé n'est supprimé que lorsque vous désinstallez l'application. [Update: Selon le commentaire de Ferran Negre , vous pouvez supprimer le canal via nm.deleteNotificationChannel(nChannel.getId()); et le recréer avec nm.createNotificationChannel(nChannel);]

Alors que les versions précédentes d'Android ne reproduisaient aucun son par défaut, cela a changé avec Android O, mais uniquement lorsque vous ciblez l'API 26, c'est-à-dire utilisez Notification Channels. C'est une incohérence, bon, en fait, c'est un bug:

La raison en est que lorsque vous créez un canal avec NotificationManager.IMPORTANCE_DEFAULT (non sain par défaut), Android l'enregistre en quelque sorte comme NotificationManager.IMPORTANCE_HIGH (joue le son par défaut).

Vous pouvez vérifier cela en allant dans les options des notifications (appui long sur l'entrée de notification), où vous pourrez lire qu'il s'agit du type NotificationManager.IMPORTANCE_HIGH, puis désactiver la notification puis la réactiver. Dans ce processus, il est "dégradé" du NotificationManager.IMPORTANCE_HIGH au NotificationManager.IMPORTANCE_DEFAULT qui ne sonne pas et qui est enregistré.

Le bogue a été soumis au système de suivi des problèmes d'Android, vous voudrez peut-être le mettre en vedette (signalé par Google comme "Ne corrigera pas (infaisable)", car ... gâché).


BTW, les nouveaux documents sur https://developer.Android.com/training/notify-user/channels Prétendent que le comportement par défaut était celui-là: default jouait un son avant Android 8.0, ce qui est certainement pas vrai. Ceci est leur liste

User-visible importance level           Importance               Priority   
                                        (Android 8.0 and higher) (Android 7.1 and lower)
Urgent  Makes a sound and appears as    IMPORTANCE_HIGH          PRIORITY_HIGH
        a heads-up notification                                  or PRIORITY_MAX
High    Makes a sound                   IMPORTANCE_DEFAULT       PRIORITY_DEFAULT
Medium  No sound                        IMPORTANCE_LOW           PRIORITY_LOW
Low     No sound and does not appear    IMPORTANCE_MIN           PRIORITY_MIN
        in the status bar

Vous pouvez même voir l'inadéquation entre l'importance de la visibilité élevée et celle des notifications ... Je ne sais pas pourquoi ils le font. Ils ont définitivement un bug dans leur code.


Tout ce qui se trouve sous la ligne suivante est obsolète, mais le bogue mentionné est toujours valide. Mon erreur était de penser que NotificationManager.IMPORTANCE_MIN est le prochain en-dessous de NotificationManager.IMPORTANCE_DEFAULT, mais que NotificationManager.IMPORTANCE_LOW l’est.


Lorsque vous accédez ensuite aux paramètres de notification de l'application via le bouton de notification de pression longue et de tous les canaux et que vous activez/désactivez le commutateur pour ce canal, il se règle en fait sur NotificationManager.IMPORTANCE_DEFAULT et aucun son ne sera joué. J'ai aussi remarqué qu'après un crash, il a été réinitialisé à NotificationManager.IMPORTANCE_HIGH

Donc, la solution consiste à utiliser NotificationManager.IMPORTANCE_MIN. Mais vous devez créer un nouveau canal pour que ce NotificationManager.IMPORTANCE_MIN soit effectif, car il apparaît que vous ne pouvez pas changer l’importance d’un canal existant une fois que vous l’avez créé.

Update: Il s'avère que la solution de contournement avec NotificationManager.IMPORTANCE_MIN présente un inconvénient.

Lorsque vous utilisez ce niveau d'importance, votre notification ne s'affiche plus complètement dans le tiroir de notifications, mais s'insère dans un nouveau groupe de canaux de notification qui est réduit par défaut (et se réduit à chaque fois que le tiroir est retiré). Quelle déception!

Mise à jour 2: En creusant un peu plus, il s'avère que c'est comme s'il l'avait correctement enregistré en tant que NotificationManager.IMPORTANCE_DEFAULT, mais d'une manière ou d'une autre, il s'est magiquement mis à niveau vers NotificationManager.IMPORTANCE_HIGH, comme ce serait le cas lorsque l'utilisateur modifie explicitement le paramètre par défaut. Celui-ci est également réinitialisé après avoir désactivé la notification, puis réactivé.

58
Daniel F

Si vous souhaitez conserver l’importance de votre chaîne et supprimer le son, notificationChannel.setSound(null, null); semble faire l'affaire.

EDIT: Assurez-vous de renommer le canal (et de supprimer l'ancien) pour qu'il soit appliqué aux utilisateurs existants. (Des canaux peuvent être créés, mais jamais modifiés par l'application, seul l'utilisateur peut le faire.)

75
mVck
NotificationManager.IMPORTANCE_LOW

Il ne produit aucun son lorsque la notification est créée car j'ai besoin de la même chose dans mon application musicale.

Et oui, si vous avez déjà créé un canal de notification, vous devez soit modifier l'ID du canal, soit simplement désinstaller l'application précédente et l'installer à nouveau.

2
Akash Bisariya

Autant que je sache, depuis l’API 26 (Oreo), il n’est plus possible de modifier le son d’une notification après sa création.

    notificationManager.deleteNotificationChannel("channel_id"));
    NotificationChannel notificationChannel = new NotificationChannel(
        "channel_id", "channel_name",
        NotificationManager.IMPORTANCE_HIGH);
    notificationChannel.setSound(null, null);
    notificationManager.createNotificationChannel(notificationChannel);

Même supprimer le canal avant la création fait not help.

_ {Google} documentation indique:

Android.app.NotificationManager public void deleteNotificationChannel(String channelId)

Supprime le canal de notification donné. Si vous créez un nouveau canal avec le même identifiant, le canal supprimé ne sera pas supprimé avec tous les paramètres identiques à ceux qu'il avait avant sa suppression.

NotificationChannel#setSound() états de la documentation

Modifiable uniquement avant que le canal ne soit soumis à NotificationManager#createNotificationChannel(NotificationChannel)

Dommage que notificationBuilder.setSound(defaultSoundUri) ne fonctionne pas aussi bien:

Cette méthode était obsolète dans l'API de niveau 26. Utilisez plutôt NotificationChannel # setSound (Uri, AudioAttributes).

Utiliser également la bibliothèque de support ne fonctionne pas. Donc, le son n'est paramétrable qu'une fois dans l'application et les modifications apportées par l'utilisateur ne sont possibles que dans les paramètres de la notification. Pour moi le commentaire de Ferran Negre n'a pas fonctionné. Je ne comprends pas pourquoi Google a fait cette restriction. Dommage.

1
acoder

Pour moi, la solution consistait à créer une notification de groupe.

val builder = NotificationCompat.Builder(this)
        .setGroupAlertBehavior(GROUP_ALERT_SUMMARY)
        .setGroup("My Group")
        .setGroupSummary(false)
        .setDefaults(DEFAULT_ALL)
        .setSound(null)

Mais dans ce cas, si vous envoyez une nouvelle notification avec un nouvel ID, celle-ci sera regroupée avec les notifications précédentes.

1
inspire_coding

D'abord, vous devez définir 

importance = NotificationManager.IMPORTANCE_LOW;

puis 

Notification n = builder.setPriority(Notification.DEFAULT_ALL).build();
n.defaults = 0;
n.defaults |= Notification.DEFAULT_VIBRATE;
0
natsujay
NotificationManager.IMPORTANCE_LOW

Cela fonctionnera, mais réduira également votre notification.

0
Nicky

J'ai rencontré le même problème dans la version 8.1 et apporté les modifications ci-dessous. Changez la priorité de la notification en BAS et cela désactivera le son de la notification. 

NotificationManager.IMPORTANCE_LOW

Le code est comme suit: 

NotificationChannel chan1 = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_LOW);
0
Kuldip Sharma

Si le cas est comme le mien, je suis obligé de montrer une notification pour le service d'arrière-plan et je ne veux pas montrer d'avis, la solution qui a fonctionné sur la version 8.0 était:

.setPriority(NotificationManager.IMPORTANCE_NONE)

Avec cela, non seulement je n'ai pas le son gênant toutes les 5 minutes, mais j'ai aussi minimisé l'apparence de la notification elle-même.

Sur 8.1 je n'ai pas eu le problème avec le son avec ce qui suit:

.setPriority(NotificationManager.IMPORTANCE_MIN)
0
tsig