Deaktivieren Sie den Sound von NotificationChannel

79

Heute habe ich angefangen, auf API 26 abzuzielen, was mich gezwungen hat, Benachrichtigungskanäle zu verwenden.

Mein Problem ist, dass jetzt bei jeder neuen Benachrichtigung (einschließlich Aktualisierungen) ein nerviger Sound abgespielt wird.

Wie kann ich diesen Sound deaktivieren?

Ich habe versucht, diesen Sound durch einen benutzerdefinierten MP3-Sound zu ersetzen, um ihn dann als MP3-Datei mit Stille zu übergeben. Dies wird jedoch ignoriert.

Ich füge nur eine Benachrichtigung hinzu, die eine sehr niedrige Priorität hat, und gebe dem Benutzer im Grunde 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, da er mit der App eine bestimmte Aktion ausgeführt hat, von der er weiß, dass eine Benachrichtigung angezeigt wird.

Der Benutzer wird sich wirklich über diesen Sound ärgern.

Daniel F.
quelle

Antworten:

119

Wenn Sie die Wichtigkeit Ihres Kanals beibehalten und einfach den Ton entfernen möchten notificationChannel.setSound(null, null); scheint dies die Aufgabe zu erfüllen.

BEARBEITEN: Stellen Sie sicher, dass Sie den Kanal umbenennen (und den alten löschen), damit er auf vorhandene Benutzer angewendet wird. (Kanäle können erstellt, aber niemals von der App geändert werden, sondern nur der Benutzer.)

mVck
quelle
20
Deinstallieren / neu installieren oder benennen Sie den NotificationChannel einfach um.
Bjarte Aune Olsen
Ein Kanal kann über die API gelöscht werden, dafür müssen Sie Ihre App nicht deinstallieren
SolidSnake
1
Ich denke, eine bessere Lösung ist zu verwenden NotificationManager.IMPORTANCE_DEFAULT. Dies deaktiviert den Ton und ist eine gute Option für die Wichtigkeit. Beachten Sie, dass, wenn Sie NotificationManager.IMPORTANCE_HIGHdieselbe Benachrichtigung mehrmals verwenden und anzeigen, diese immer wieder angezeigt wird. Durch IMPORTANCE_DEFAULTdie Verwendung wird auch verhindert, dass diese Benachrichtigung erneut angezeigt wird, wenn Sie dieselbe Benachrichtigung anzeigen.
Markymark
14
@ Markymark FALSCH Ich habe verwendet NotificationManager.IMPORTANCE_DEFAULTund hatte immer noch einen Ton, als die Benachrichtigung erstellt wurde
user924
2
NotificationManager.IMPORTANCE_LOW funktioniert für mich in meiner Musikanwendung, um den Sound zu deaktivieren.
Akash Bisariya
96

(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_HIGHauf 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_MINdas der nächst niedrigere ist NotificationManager.IMPORTANCE_DEFAULT, aber NotificationManager.IMPORTANCE_LOWist.


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

Daniel F.
quelle
8
Wirklich wichtiger Teil dieser Antwort: "Sobald ein Kanal erstellt wurde, können Sie die Wichtigkeit nicht mehr ändern (nun, Sie können, aber die neue Wichtigkeit wird ignoriert)." Ich hatte lange Probleme, weil ich nicht verstand, warum sich die Änderungen an meinem NotificationChannel nicht auf das Verhalten der App auswirkten. Ich musste den Kanal jedes Mal umbenennen, wenn ich ihn änderte, um die Änderung zu sehen.
Bjarte Aune Olsen
neue Kanal-ID oder neuer Kanalname oder sowohl neue Kanal-ID als auch Kanalname?
user924
1
Ich habe eingestellt IMPORTANCE_DEFAULTund Sound wurde gespielt
user924
Traurig zu sehen, dass ein so einfacher Fehler immer noch nicht behoben wird. Vielen Dank, dass Sie alle Details notiert haben und denselben Schmerz durchgemacht haben.
Kira
1
Ich denke wenn du es tust: nm.deleteNotificationChannel(nChannel.getId());und nm.createNotificationChannel(nChannel);danach wieder. Dann NotificationManager.IMPORTANCE_LOWfunktioniert der Wille (funktioniert bei mir).
Ferran Negre
6

Soweit ich gesehen habe, ist es seit API 26 (Oreo) nicht möglich, den Sound einer Benachrichtigung nach ihrer Erstellung zu ändern.

    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 allen Einstellungen gelöscht, die er vor dem Löschen hatte.

NotificationChannel#setSound() Dokumentationszustände

Nur änderbar, bevor der Kanal an gesendet wird NotificationManager#createNotificationChannel(NotificationChannel)

Schade, dass notificationBuilder.setSound(defaultSoundUri)das nicht so gut funktioniert:

Diese Methode wurde in API-Stufe 26 nicht mehr unterstützt. Verwenden Sie stattdessen NotificationChannel # setSound (Uri, AudioAttributes).

Auch die Verwendung der Support-Bibliothek funktioniert nicht. Der Sound ist also nur einmal in der App einstellbar und eine Änderung durch den Benutzer ist nur in den Einstellungen der Benachrichtigung möglich. Für mich hat Ferran Negres Kommentar nicht funktioniert. Ich verstehe nicht, warum Google diese Einschränkung vorgenommen hat. Schade.

Akustiker
quelle
2
NotificationManager.IMPORTANCE_LOW

Es wird kein Ton erzeugt, wenn eine Benachrichtigung erstellt wird, da ich dieselbe in meiner Musikanwendung benötige.

Und ja, wenn Sie bereits einen Benachrichtigungskanal erstellt haben, müssen Sie entweder die Kanal-ID ändern oder einfach die vorherige Anwendung deinstallieren und erneut installieren.

Akash Bisariya
quelle
2

Für mich bestand die Lösung darin, eine Gruppenbenachrichtigung zu erstellen .

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

Wenn Sie in diesem Fall jedoch eine neue Benachrichtigung mit einer neuen ID senden, wird diese mit den vorherigen Benachrichtigungen gruppiert.

inspir_coding
quelle
2

Ich habe viele Android-Geräte getestet, der folgende Code funktioniert für mich richtig

Erstellen Sie zunächst einen Benachrichtigungs-Builder. Wenn Ihre Build.Version größer als 26 ist, fügen Sie bitte einen neuen Kanal hinzu.

  private val notificationBuilder: NotificationCompat.Builder by lazy {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) NotificationCompat.Builder(context) else {
            val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val channelId = "MUSIC"
            val channelName = "音乐控制栏"
            val importance = NotificationManager.IMPORTANCE_MIN
            val channel = NotificationChannel(channelId, channelName, importance)

            manager.createNotificationChannel(channel)
            channel.enableLights(false)
            channel.vibrationPattern = longArrayOf(0L)
            channel.enableVibration(false)
            channel.setSound(null, null)
            NotificationCompat.Builder(context, channelId)
        }

    }

Zweitens initialisieren Sie diesen Benachrichtigungsbauer und setzen Sie Sound auf Null

   notificationBuilder.setDefaults(Notification.DEFAULT_LIGHTS ).setVibrate( longArrayOf(0L)).setSound(null)

Drittens, wenn build.version größer als 24 ist, legen Sie bitte die Priorität fest.

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            notificationBuilder.priority = NotificationManager.IMPORTANCE_MIN
        }

Hoffe das funktioniert bei dir.

Cyrus
quelle
1
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationChannel = NotificationChannel(
                channelId.toString(), title,
               NotificationManager.IMPORTANCE_DEFAULT
            )
            notificationChannel.setSound(null,null)
            notificationChannel.enableVibration(false)
            notificationChannel.description = body
            if(notificationManager.getNotificationChannel(channelId.toString())==null) {
                notificationManager.createNotificationChannel(notificationChannel)
            }
            if (data["sound"]?.equals("default", true) == true) {//if your app need contorl sound enable
                RingtoneManager.getRingtone(
                    this,
                    RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
                ).play()
            }
            if(pushShake.isTrue() ){//if your app need contorl vibarate enable
               val vbmanager=  getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
                vbmanager.vibrate(VibrationEffect.createOneShot(500,VibrationEffect.DEFAULT_AMPLITUDE))
            }
        }

Im folgenden Code geht es um Benachrichtigung, aber Sound, Vibration wird bei API 26 nicht abgespielt. Machen Sie sich also keine Sorgen über Setsound oder Setvibrate

notificationManager.notify(channelId.toInt(), notificationBuilder.apply {
            setContentIntent(pendingIntent)
            setSmallIcon(R.drawable.img_logo)
            setTicker(title)
            setNumber(data["badge"]?.toIntOrNull() ?: 0)
            setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL)
            color = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
                resources.getColorMuteDepre(R.color.colorAccent2)
            } else {
                Color.parseColor("#ffffff")
            }


            setContentTitle(title)
            setContentText(body)
            setWhen(System.currentTimeMillis())
            setAutoCancel(true)
            setSound(null)
            setVibrate(longArrayOf())
            if (pushShake.isTrue() &&  data["sound"]?.equals("default", true) == true) {
                setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                    val vbmanager = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
                    vbmanager.vibrate(500)
                }
            }else{
                if (data["sound"]?.equals("default", true) == true) {
                    setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                }
                if (pushShake.isTrue() ) {
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                        val vbmanager = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
                        vbmanager.vibrate(500)
                    }
                }
            }


            setStyle(
                NotificationCompat.BigTextStyle().bigText(body).setSummaryText(body).setBigContentTitle(
                    title
                )
            )
            setPriority(NotificationCompat.PRIORITY_DEFAULT)

        }.build())
HongSec Park
quelle
1

NotificationCompat.Builder.setSilent(true)

Auf diese Weise können Sie unabhängig von der Wichtigkeitseinstellung des Kanals eine stille Benachrichtigung (kein Ton oder Vibration) senden.

Referenz: https://developer.android.com/reference/androidx/core/app/NotificationCompat.Builder#setSilent(boolean)

AeroEchelon
quelle
Klingt nach einer hilfreichen Antwort. Ich möchte nur darauf hinweisen, dass dies Teil der Android Jetpack-Bibliotheken ist ( androidxdie wahrscheinlich die meisten von uns sowieso verwenden).
Daniel F
0

Wenn der Fall wie der meine ist, muss ich eine Benachrichtigung für den Hintergrunddienst anzeigen und möchte keine Benachrichtigung anzeigen. Die Lösung, die unter 8.0 funktioniert hat, war:

.setPriority(NotificationManager.IMPORTANCE_NONE)

Damit bekam ich nicht nur nicht alle 5 Minuten den nervigen Ton, sondern minimierte auch das Auftreten der Benachrichtigung selbst.

Auf 8.1 hatte ich kein Problem mit dem Sound mit folgendem:

.setPriority(NotificationManager.IMPORTANCE_MIN)
tsig
quelle
Ich denke, das OP möchte immer noch eine Benachrichtigung anzeigen. Das Ausblenden einer Benachrichtigung, nur um den Ton loszuwerden, klingt nicht nach der richtigen Antwort.
Tir38
0

Sie können zwei verschiedene Benachrichtigungskanäle verwenden, um Benachrichtigungen zu senden, abhängig von der Priorität des Benutzers.

Wenn es sich um eine Benachrichtigung mit hoher Priorität handelt, senden Sie diese über

new NotificationChannel("Channel ID", "Channel Name", NotificationManager.IMPORTANCE_HIGH);

Ihr Benutzer erhält Sound und Pop, wenn er eine Benachrichtigung erhält.

Wenn Sie weniger wichtige Benachrichtigungen senden möchten, verwenden Sie diesen Kanal.

new NotificationChannel("Channel ID", "Channel Name", NotificationManager.IMPORTANCE_LOW);

Ihr Benutzer erhält eine Benachrichtigung ohne Ton und wird angezeigt.

Überprüfen Sie die andere Priorität als hier - https://developer.android.com/reference/android/app/NotificationManager

Priyankchoudhary
quelle
-1

Keine Notwendigkeit zu verwenden .setSound(null, null)

Verwenden Sie einfach den folgenden Code

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this,
                getString(R.string.notification_channel_id))
                .setContentTitle("Audio Recording")
                .setContentText("recording in progress")
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setSmallIcon(R.mipmap.ic_launcher);

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    getString(R.string.notification_channel_id), "AOD+", NotificationManager.IMPORTANCE_LOW
            );
            channel.setDescription("Call Recorder is running");
            channel.setShowBadge(true);
            channel.canShowBadge();
            channel.setLightColor(Color.GREEN);
            channel.enableVibration(false);

            assert notificationManager != null;
            notificationManager.createNotificationChannel(channel);
        }

        assert notificationManager != null;
        startForeground(256/* must be greater than 0*/, notificationBuilder.build()); //I am using this for audio recording
        //notificationManager.notify(0, notificationBuilder.build());
Khalid Lakhani
quelle
-2

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;
Natsujay
quelle
Erklären Sie, was der letzte Codeabschnitt bewirkt? Was hat DEFAULT_VIBRATEdas zu tun?
Tir38
-2
NotificationManager.IMPORTANCE_LOW

Dies wird funktionieren, aber auch Ihre Benachrichtigung reduziert.

Nicky
quelle
Dies ist eine bemerkenswerte Nebenwirkung, wenn es wahr ist. Ich kann es nicht bestätigen, da ich benutzerdefinierte Benachrichtigungen verwende und diese nicht zusammenbrechen. Auf welcher Betriebssystemversion passiert Ihnen das? Ich hatte dies mitNotificationManager.IMPORTANCE_MIN
Daniel F
Benutzerdefinierte Benachrichtigungen werden ebenfalls reduziert, wenn Sie zwei kleine und große Benachrichtigungen übergeben. Übrigens verwende ich das 8.1-API-Gerät.
Nicky
1
Was fügt diese Antwort hinzu, die die Antworten von @DanielF und Akash noch nicht enthalten?
Tir38
-2

NotificationManager.IMPORTANCE_LOW wird sicher funktionieren

SHUBHAM
quelle
4
Dies scheint nur eine Wiederholung / Bestätigung vieler der vorhandenen Antworten zu sein.
Pang
-2

Ich hatte das gleiche Problem in Version 8.1 und nahm die folgenden Änderungen vor. Wenn Sie die Priorität der Benachrichtigung auf NIEDRIG ändern, wird der Benachrichtigungston deaktiviert.

NotificationManager.IMPORTANCE_LOW

Der Code lautet wie folgt:

NotificationChannel chan1 = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_LOW);
Kuldip Sharma
quelle
2
Ja, das ist es, was die akzeptierte Antwort sowie die Antworten vom 27. Juni und 16. Mai besagen, die beiden letzteren auch mit besserer Codeformatierung.
Daniel F