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.
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é.
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.)
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.
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.
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.
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;
NotificationManager.IMPORTANCE_LOW
Cela fonctionnera, mais réduira également votre notification.
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);
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)