wake-up-neo.com

Deaktivieren Sie den Ton von NotificationChannel

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.

47
Daniel F

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.

58
Daniel F

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.)

75
mVck
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.

2
Akash Bisariya

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.

1
acoder

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.

1
inspire_coding

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;
0
natsujay
NotificationManager.IMPORTANCE_LOW

Dies wird funktionieren, aber auch Ihre Benachrichtigung wurde reduziert.

0
Nicky

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);
0
Kuldip Sharma

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)
0
tsig