Heute habe ich mich auf API 26 konzentriert, was mich zur Verwendung von Benachrichtigungskanälen zwang.
Mein Problem ist, dass jetzt bei jeder neuen Benachrichtigung (einschließlich Updates) ein ärgerlicher Ton abgespielt wird.
Wie kann ich diesen Ton deaktivieren?
Ich habe versucht, diesen Sound durch einen benutzerdefinierten MP3-Sound zu ersetzen, um ihm dann einen MP3 mit Stille zu übergeben. Dies wird jedoch ignoriert.
Ich füge nur eine Benachrichtigung hinzu, die eine sehr niedrige Priorität hat, und gibt dem Benutzer grundsätzlich die Möglichkeit, einige Aktionen auszuführen, nachdem er mit der App interagiert hat. Es gibt keinen Grund, laut zu sein. Der Benutzer wird wissen, dass er auf die Benachrichtigung verweisen kann, weil er mit der App eine bestimmte Aktion ausgeführt hat, von der er weiß, dass eine Benachrichtigung angezeigt wird.
Der Benutzer wird wirklich anfangen, sich durch dieses Geräusch zu ärgern.
Die Lösung ist, NotificationManager.IMPORTANCE_LOW
zu verwenden und einen neuen Kanal dafür zu erstellen. Sobald ein Kanal erstellt wurde, können Sie die Wichtigkeit nicht ändern (Sie können dies tun, aber die neue Wichtigkeit wird ignoriert). Die Kanalinformationen werden vom System dauerhaft gespeichert. Jeder erstellte Kanal wird nur gelöscht, wenn Sie die App deinstallieren. [Update: Gemäß dem Kommentar von Ferran Negre können Sie den Kanal über nm.deleteNotificationChannel(nChannel.getId());
löschen und mit nm.createNotificationChannel(nChannel);
neu erstellen.]
Während in früheren Android-Versionen standardmäßig kein Ton wiedergegeben wurde, hat sich dies bei Android O geändert, jedoch nur, wenn Sie die API 26 als Ziel verwenden, d. H. Benachrichtigungskanäle verwenden. Das ist eine Inkonsistenz, eigentlich ist es ein Fehler:
Der Grund dafür ist, dass Android bei der Erstellung eines Kanals mit NotificationManager.IMPORTANCE_DEFAULT
(standardmäßig nicht soundworthy) "etwas" als NotificationManager.IMPORTANCE_HIGH
registriert (standardmäßig Ton wiedergibt).
Sie können dies überprüfen, indem Sie in die Optionen der Benachrichtigungen gehen (langer Druck auf den Benachrichtigungseintrag). Dort können Sie lesen, dass es sich um den Typ NotificationManager.IMPORTANCE_HIGH
handelt. Dann deaktivieren Sie die Benachrichtigung und aktivieren Sie sie erneut. In diesem Prozess wird es vom NotificationManager.IMPORTANCE_HIGH
zum nicht klingenden, tatsächlich registrierten NotificationManager.IMPORTANCE_DEFAULT
"heruntergestuft".
Der Fehler wurde an den Android-Issue-Tracker übermittelt, daher sollten Sie ihn mit einem Sternchen markieren (von Google als "Wird nicht fixiert (unlösbar)" gekennzeichnet, weil ... verwöhnt).
Übrigens, die neuen Dokumente unter https://developer.Android.com/training/notify-user/channels .__ behaupten, dass das Standardverhalten so war, dass Standard abgespielt wurde ein Sound vor Android 8.0, der definitiv nicht wahr ist. Dies ist ihre 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
Sie können sogar das Missverhältnis zwischen der Wichtigkeit der Sichtbarkeit und der Wichtigkeit der Benachrichtigung sehen. Ich weiß nicht, warum sie das tun. Sie haben definitiv einen Fehler in ihrem Code.
Alles unter der nächsten Zeile ist veraltet, aber der dort erwähnte Fehler ist noch gültig. Mein Fehler war zu denken, dass NotificationManager.IMPORTANCE_MIN
der nächstniedrigere von NotificationManager.IMPORTANCE_DEFAULT
ist, aber NotificationManager.IMPORTANCE_LOW
ist.
Wenn Sie dann in die Benachrichtigungseinstellungen der App über langes Drücken der Benachrichtigungs- und All-Channel-Taste gehen und den Schalter für diesen Kanal aus- und wieder einschalten, stellt sich der Wert tatsächlich auf NotificationManager.IMPORTANCE_DEFAULT
und es wird kein Ton wiedergegeben. Ich habe auch bemerkt, dass es nach einem Absturz auf NotificationManager.IMPORTANCE_HIGH
zurückgesetzt wurde.
Im Grunde ist die Problemumgehung die Verwendung von NotificationManager.IMPORTANCE_MIN
. Sie müssen jedoch einen neuen Kanal erstellen, damit dieser NotificationManager.IMPORTANCE_MIN
wirksam ist, denn es scheint, dass Sie die Wichtigkeit eines bereits vorhandenen Kanals nicht ändern können, sobald Sie ihn erstellt haben.
Update: Die Problemumgehung mit NotificationManager.IMPORTANCE_MIN
hat einen Nachteil.
Wenn Sie diese Wichtigkeitsstufe verwenden, wird Ihre Benachrichtigung nicht mehr vollständig in der Benachrichtigungsschublade angezeigt, sondern fügt sich selbst in eine neue Benachrichtigungskanalgruppe ein, die standardmäßig reduziert ist (und bei jedem Ziehen der Schublade wieder abgeblendet wird). Ach wie schade!
Update 2: Etwas tiefer graben stellt sich heraus, dass es so ist, als hätte es es korrekt als NotificationManager.IMPORTANCE_DEFAULT
registriert, aber irgendwie wurde es auf magische Weise zu NotificationManager.IMPORTANCE_HIGH
aktualisiert, als würde der Benutzer die Einstellung explizit von hoch auf hoch setzen. Dieser wird auch auf den Standardwert zurückgesetzt, nachdem die Benachrichtigung aus- und wieder eingeschaltet wurde.
Wenn Sie die Wichtigkeit Ihres Kanals beibehalten und einfach den Sound entfernen möchten, scheint notificationChannel.setSound(null, null);
die Aufgabe zu erfüllen.
EDIT: Stellen Sie sicher, dass Sie den Kanal umbenennen (und den alten löschen), um ihn auf vorhandene Benutzer anzuwenden. (Channels können erstellt, aber niemals von der App geändert werden, nur der Benutzer kann das tun.)
NotificationManager.IMPORTANCE_LOW
Es wird kein Ton erzeugt, wenn eine Benachrichtigung erstellt wird, da ich dieselbe in meiner Musikanwendung benötige.
Wenn Sie bereits einen Benachrichtigungskanal erstellt haben, müssen Sie entweder die Kanal-ID ändern oder einfach die vorherige Anwendung deinstallieren und erneut installieren.
Soweit ich gesehen habe, ist es seit API 26 (Oreo) nicht möglich, den Sound einer Benachrichtigung zu ändern, nachdem sie einmal erstellt wurde.
notificationManager.deleteNotificationChannel("channel_id"));
NotificationChannel notificationChannel = new NotificationChannel(
"channel_id", "channel_name",
NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setSound(null, null);
notificationManager.createNotificationChannel(notificationChannel);
Selbst das Löschen des Kanals vor der Erstellung hilft nicht .
In der Google Dokumentation heißt es:
Android.app.NotificationManager public void deleteNotificationChannel(String channelId)
Löscht den angegebenen Benachrichtigungskanal. Wenn Sie einen neuen Kanal mit derselben ID erstellen, wird der gelöschte Kanal mit denselben Einstellungen wie vor dem Löschen wieder gelöscht.
NotificationChannel#setSound()
dokumentationsstatus
Nur änderbar, bevor der Kanal an
NotificationManager#createNotificationChannel(NotificationChannel)
gesendet wird
Schade, dass notificationBuilder.setSound(defaultSoundUri)
nicht so gut funktioniert:
Diese Methode wurde in API-Ebene 26 verworfen. Verwenden Sie stattdessen NotificationChannel # setSound (Uri, AudioAttributes).
Auch die Verwendung der Support-Bibliothek funktioniert nicht. So ist der Ton nur einmal in der App einstellbar und eine Änderung durch den Benutzer ist nur in den Einstellungen der Benachrichtigung möglich. Für mich Ferran Negres Kommentar hat nicht funktioniert. Ich verstehe nicht, warum Google diese Einschränkung vorgenommen hat. Schade.
Für mich war die Lösung Gruppenbenachrichtigung erstellen.
val builder = NotificationCompat.Builder(this)
.setGroupAlertBehavior(GROUP_ALERT_SUMMARY)
.setGroup("My Group")
.setGroupSummary(false)
.setDefaults(DEFAULT_ALL)
.setSound(null)
Wenn Sie jedoch in diesem Fall eine neue Benachrichtigung mit einer neuen ID senden, wird diese mit den vorherigen Benachrichtigungen gruppiert.
Zuerst müssen Sie einstellen
importance = NotificationManager.IMPORTANCE_LOW;
dann
Notification n = builder.setPriority(Notification.DEFAULT_ALL).build();
n.defaults = 0;
n.defaults |= Notification.DEFAULT_VIBRATE;
NotificationManager.IMPORTANCE_LOW
Dies wird funktionieren, aber auch Ihre Benachrichtigung wurde reduziert.
Ich habe das gleiche Problem in der 8.1 gesehen und die folgenden Änderungen vorgenommen. Ändern Sie die Priorität der Benachrichtigung auf LOW, um den Ton der Benachrichtigung zu deaktivieren.
NotificationManager.IMPORTANCE_LOW
Der Code ist wie folgt:
NotificationChannel chan1 = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_LOW);
Wenn der Fall wie der von mir ist, dass ich gezwungen sein muss, eine Benachrichtigung für den Hintergrunddienst anzuzeigen, und ich möchte nicht wirklich eine Benachrichtigung anzeigen, war die Lösung, die unter 8.0 funktioniert hat:
.setPriority(NotificationManager.IMPORTANCE_NONE)
Dadurch bekam ich nicht nur alle fünf Minuten den störenden Ton, sondern auch das Erscheinungsbild der Benachrichtigung selbst.
An 8.1 hatte ich das Problem mit dem Sound mit folgendem nicht:
.setPriority(NotificationManager.IMPORTANCE_MIN)