(Update 2019-05: Mit Android Q wird es schlimmer, da bekomme ich sogar einen Sound NotificationManager.IMPORTANCE_LOW
, zumindest im Emulator ...)
Die Lösung besteht darin NotificationManager.IMPORTANCE_LOW
, einen neuen Kanal dafür zu verwenden und zu erstellen. Sobald ein Kanal erstellt wurde, können Sie die Wichtigkeit nicht mehr ändern (nun ja, aber die neue Wichtigkeit wird ignoriert). Die Kanalinformationen scheinen permanent vom System gespeichert zu werden, und jeder erstellte Kanal wird nur gelöscht, wenn Sie die App deinstallieren. [ Update : Laut dem Kommentar von Ferran Negre können Sie den Kanal über löschen nm.deleteNotificationChannel(nChannel.getId());
und mit neu erstellen, nm.createNotificationChannel(nChannel);
aber anscheinend gibt es eine Einschränkung, dass Sie keinen Kanal mit derselben ID eines gelöschten Kanals erstellen können und erwarten, dass Sie einen anderen anwenden können Einstellungen zum nicht gelöschten Kanal, siehe Akustiker ‚s Antwort]
Während frühere Android-Versionen standardmäßig keinen Sound wiedergaben, änderte sich dies mit Android O, jedoch nur, wenn Sie auf die API 26 abzielen, dh Benachrichtigungskanäle verwenden. Dies ist eine Inkonsistenz, eigentlich ist es ein Fehler:
Der Grund dafür ist, dass wenn Sie einen Kanal mit NotificationManager.IMPORTANCE_DEFAULT
(standardmäßig nicht klangwürdig) Android erstellen, dieser tatsächlich "etwas" registriert wird NotificationManager.IMPORTANCE_HIGH
(spielt standardmäßig Ton ab).
Sie können dies überprüfen, indem Sie in die Optionen der Benachrichtigungen gehen (lange auf den Benachrichtigungseintrag drücken), wo Sie lesen können, dass es sich um einen Typ handelt NotificationManager.IMPORTANCE_HIGH
, die Benachrichtigung deaktivieren und dann wieder aktivieren. In diesem Prozess wird es von dem NotificationManager.IMPORTANCE_HIGH
auf den nicht klingenden, tatsächlich registrierten "heruntergestuft" NotificationManager.IMPORTANCE_DEFAULT
.
Der Fehler wurde an den Android Issue Tracker gesendet , daher möchten Sie ihn möglicherweise markieren (von Google als "Won't Fix (Infeasible)" gekennzeichnet, weil ... verwöhnt).
Übrigens
behaupten die neuen Dokumente unter https://developer.android.com/training/notify-user/channels , dass das Standardverhalten früher so war, dass standardmäßig ein Sound vor Android 8.0 abgespielt wurde, was definitiv nicht stimmt . 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 die Nichtübereinstimmung zwischen hoher Sichtbarkeit und hoher Benachrichtigungsbedeutung erkennen ... Ich weiß nicht, warum sie dies tun. Sie haben definitiv einen Fehler in ihrem Code.
Alles unter der nächsten Zeile ist veraltet , aber der dort erwähnte Fehler ist immer noch gültig. Mein Fehler dort war zu denken, dass NotificationManager.IMPORTANCE_MIN
das der nächst niedrigere ist NotificationManager.IMPORTANCE_DEFAULT
, aber NotificationManager.IMPORTANCE_LOW
ist.
Wenn Sie dann über langes Drücken der Benachrichtigungstaste und der Schaltfläche für alle Kanäle in die Benachrichtigungseinstellungen der App wechseln und den Schalter für diesen Kanal aus- und wieder einschalten, stellt er sich tatsächlich auf ein NotificationManager.IMPORTANCE_DEFAULT
und es wird kein Ton abgespielt. Mir ist auch aufgefallen, dass es nach einem Absturz auf zurückgesetzt wurdeNotificationManager.IMPORTANCE_HIGH
Grundsätzlich ist die Problemumgehung zu verwenden NotificationManager.IMPORTANCE_MIN
. Sie müssen jedoch einen neuen Kanal erstellen, damit dies NotificationManager.IMPORTANCE_MIN
wirksam wird, da Sie anscheinend die Bedeutung eines bereits vorhandenen Kanals nach dem Erstellen nicht mehr ändern können .
Update: Es stellt sich die Problemumgehung mit herausNotificationManager.IMPORTANCE_MIN
einen Nachteil hat.
Wenn Sie diese Wichtigkeitsstufe verwenden, wird Ihre Benachrichtigung nicht mehr vollständig in der Benachrichtigungsschublade angezeigt, sondern in eine neue Benachrichtigungskanalgruppe eingefügt, die standardmäßig reduziert wird (und sich bei jedem Herunterziehen der Schublade erneut reduziert). Ach wie schade!
Update 2: Wenn Sie etwas tiefer graben, stellt sich heraus, dass es so ist, als ob es korrekt registriert wurde NotificationManager.IMPORTANCE_DEFAULT
, aber irgendwie wurde es auf magische Weise aktualisiert NotificationManager.IMPORTANCE_HIGH
, wie es der Fall wäre, wenn der Benutzer die Einstellung explizit von Standard auf Hoch ändert. Dieser wird auch auf die Standardeinstellungen zurückgesetzt, nachdem die Benachrichtigung aus- und wieder eingeschaltet wurde.