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.
quelle
NotificationManager.IMPORTANCE_DEFAULT
. Dies deaktiviert den Ton und ist eine gute Option für die Wichtigkeit. Beachten Sie, dass, wenn SieNotificationManager.IMPORTANCE_HIGH
dieselbe Benachrichtigung mehrmals verwenden und anzeigen, diese immer wieder angezeigt wird. DurchIMPORTANCE_DEFAULT
die Verwendung wird auch verhindert, dass diese Benachrichtigung erneut angezeigt wird, wenn Sie dieselbe Benachrichtigung anzeigen.NotificationManager.IMPORTANCE_DEFAULT
und hatte immer noch einen Ton, als die Benachrichtigung erstellt wurde(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öschennm.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 wirdNotificationManager.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 demNotificationManager.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 istNotificationManager.IMPORTANCE_DEFAULT
, aberNotificationManager.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 diesNotificationManager.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 heraus
NotificationManager.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 aktualisiertNotificationManager.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.quelle
IMPORTANCE_DEFAULT
und Sound wurde gespieltnm.deleteNotificationChannel(nChannel.getId());
undnm.createNotificationChannel(nChannel);
danach wieder. DannNotificationManager.IMPORTANCE_LOW
funktioniert der Wille (funktioniert bei mir).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:
NotificationChannel#setSound()
DokumentationszuständeSchade, dass
notificationBuilder.setSound(defaultSoundUri)
das nicht so gut funktioniert: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.
quelle
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.
quelle
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.
quelle
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.
quelle
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())
quelle
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)
quelle
androidx
die wahrscheinlich die meisten von uns sowieso verwenden).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)
quelle
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
quelle
Da die WICHTIGE Lösung den Nebeneffekt hat, dass kein Benachrichtigungs-Popup angezeigt wird, habe ich eine endgültige Lösung erhalten:
https://github.com/anars/blank-audio/blob/master/1-second-of-silence.mp3
quelle
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());
quelle
Zuerst müssen Sie einstellen
importance = NotificationManager.IMPORTANCE_LOW;
dann
quelle
DEFAULT_VIBRATE
das zu tun?NotificationManager.IMPORTANCE_LOW
Dies wird funktionieren, aber auch Ihre Benachrichtigung reduziert.
quelle
NotificationManager.IMPORTANCE_MIN
NotificationManager.IMPORTANCE_LOW
wird sicher funktionierenquelle
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);
quelle