Подтвердить что ты не робот

Отключить звук из NotificationChannel

Сегодня я начал настраивать API 26, что заставило меня использовать каналы уведомлений.

Моя проблема заключается в том, что теперь при каждом новом уведомлении (включая обновления) звучит раздражающий звук.

Как отключить этот звук?

Я попытался заменить этот звук обычным mp3-звуком, чтобы потом передать ему mp3 с тишиной, но это игнорируется.

Я просто добавляю уведомление, которое имеет очень низкий приоритет, в основном предоставляя пользователю возможность выполнять некоторые действия после того, как он взаимодействует с приложением. Там нет причин быть громким, пользователь будет знать, что он может ссылаться на уведомление, потому что он сделал определенную вещь с приложением, которое, как он знает, приведет к появлению уведомления.

Пользователь действительно начнет раздражаться этим звуком.

4b9b3361

Ответ 1

(Обновление 2019-05: с Android Q все ухудшается, там я даже получаю звук при использовании NotificationManager.IMPORTANCE_LOW, по крайней мере, в эмуляторе...)


Решение состоит в том, чтобы использовать NotificationManager.IMPORTANCE_LOW и создать для него новый канал. После того, как канал создан, вы не можете изменить важность (ну, вы можете, но новая важность игнорируется). Информация о канале постоянно сохраняется системой, и любой созданный канал удаляется только при удалении приложения. [Обновление: согласно комментарию Феррана Негре, вы можете удалить канал с помощью nm.deleteNotificationChannel(nChannel.getId()); и воссоздайте его с помощью nm.createNotificationChannel(nChannel); но, очевидно, существует ограничение, заключающееся в том, что вы не можете создать канал с тем же идентификатором удаленного канала и ожидать, что сможете применить другие настройки к неосуществленному каналу, см. ответ кодера ]

Хотя предыдущие версии Android по умолчанию не воспроизводили звук, это изменилось в Android O, но только когда вы настроили API 26, то есть использовали каналы уведомлений. Это несоответствие, ну, на самом деле, это ошибка:

Причиной этого является то, что при создании канала с NotificationManager.IMPORTANCE_DEFAULT (по умолчанию не заслуживающим звука) Android фактически "несколько" зарегистрирует его как NotificationManager.IMPORTANCE_HIGH (по умолчанию воспроизводит звук).

Вы можете проверить это, зайдя в опции уведомлений (долгое нажатие на запись уведомления), где вы получите, чтобы прочитать, что это имеет тип NotificationManager.IMPORTANCE_HIGH а затем отключите уведомление и затем снова включите его. В этом процессе он "понижается" от NotificationManager.IMPORTANCE_HIGH до фактически не зарегистрированного NotificationManager.IMPORTANCE_DEFAULT.

Ошибка была отправлена на устройство отслеживания проблем Android, поэтому вы можете пометить ее (помечено Google как "Не исправлять (невозможно)", потому что... испорчено).


Кстати, новые документы на https://developer.android.com/training/notify-user/channels утверждают, что поведение по умолчанию было таким, что по умолчанию воспроизводился звук до Android 8.0, что определенно не соответствует действительности. Это их список

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

Вы даже можете увидеть несоответствие между высокой важностью видимости и высокой важностью уведомлений... Я не знаю, почему они это делают. У них определенно есть ошибка в их коде.


Все, что ниже следующей строки, устарело, но упомянутая ошибка все еще действует. Моя ошибка заключалась в том, что я думаю, что NotificationManager.IMPORTANCE_MIN является следующим более низким из NotificationManager.IMPORTANCE_DEFAULT, но NotificationManager.IMPORTANCE_LOW - это.


Когда вы затем войдете в настройки уведомлений приложения с помощью длинного нажатия на уведомления и кнопки всех каналов и включите и снова включите переключатель для этого канала, тогда он фактически установит для себя NotificationManager.IMPORTANCE_DEFAULT и звук не будет воспроизводиться. Я также заметил, что после сбоя он сбрасывается в NotificationManager.IMPORTANCE_HIGH

Поэтому в основном обходной путь заключается в использовании NotificationManager.IMPORTANCE_MIN. Но вы должны создать новый канал, чтобы этот NotificationManager.IMPORTANCE_MIN действовал, потому что кажется, что вы не можете изменить важность уже существующего канала, как только вы его создали.

Обновление: обходит обходной путь с NotificationManager.IMPORTANCE_MIN Недостаток IMPORTANCE_MIN.

Когда вы используете этот уровень важности, тогда ваше уведомление больше не отображается полностью в ящике уведомлений, а вставляется в новую группу каналов уведомлений, которая по умолчанию свернута (и будет сворачиваться снова каждый раз, когда ящик снят). Какой облом!

Обновление 2: копание немного глубже, получается, что он как будто правильно зарегистрировал его как NotificationManager.IMPORTANCE_DEFAULT, но каким-то образом он волшебным образом обновился до NotificationManager.IMPORTANCE_HIGH, как это было бы, когда пользователь явно изменяет настройку со значения по умолчанию на высокое. Этот также сбрасывается к значению по умолчанию после выключения и повторного включения уведомления.

Ответ 2

Если вы хотите сохранить важность вашего канала и просто удалить звуковое notificationChannel.setSound(null, null); кажется, делает работу.

РЕДАКТИРОВАТЬ: Обязательно переименуйте канал (и удалите старый), чтобы применить его к существующим пользователям. (Каналы могут создаваться, но никогда не изменяться приложением, может только пользователь.)

Ответ 3

NotificationManager.IMPORTANCE_LOW

Он не создает звука при создании уведомлений, так как мне нужно то же самое в моем музыкальном приложении.

И да, если вы уже создали канал уведомлений, либо вам нужно изменить идентификатор канала, либо просто удалить предыдущее приложение и установить его снова.

Ответ 4

Насколько я видел, начиная с API 26 (Oreo) невозможно изменить звук уведомления после его создания.

    notificationManager.deleteNotificationChannel("channel_id"));
    NotificationChannel notificationChannel = new NotificationChannel(
        "channel_id", "channel_name",
        NotificationManager.IMPORTANCE_HIGH);
    notificationChannel.setSound(null, null);
    notificationManager.createNotificationChannel(notificationChannel);

Даже удаление канала перед созданием не помогает.

Документация Google гласит:

android.app.NotificationManager public void deleteNotificationChannel(String channelId)

Удаляет указанный канал уведомлений. Если вы создадите новый канал с тем же идентификатором, удаленный канал будет удален со всеми теми же настройками, которые были до его удаления.

NotificationChannel#setSound() состояния документации

NotificationManager#createNotificationChannel(NotificationChannel) только перед тем, как канал будет передан в NotificationManager#createNotificationChannel(NotificationChannel)

Очень жаль, что notificationBuilder.setSound(defaultSoundUri) не работает так же хорошо:

Этот метод устарел на уровне API 26. Вместо этого используйте NotificationChannel # setSound (Uri, AudioAttributes).

Также использование библиотеки поддержки не работает. Так что звук в приложении можно установить только один раз, а изменение пользователем возможно только в настройках уведомления. Для меня комментарий Феррана Негре не сработал. Я не понимаю, почему Google сделал это ограничение. Очень плохо.

Ответ 5

Если случай похож на мой, то я вынужден показать уведомление для фонового сервиса, и я действительно не хочу показывать какое-либо уведомление, решение, которое работало на 8.0:

.setPriority(NotificationManager.IMPORTANCE_NONE)

При этом не только я не получал раздражающего звука каждые 5 минут, но и сводил к минимуму появление самого уведомления.

На 8.1 у меня не было проблемы со звуком со следующим:

.setPriority(NotificationManager.IMPORTANCE_MIN)

Ответ 6

Сначала вам нужно установить

importance = NotificationManager.IMPORTANCE_LOW;

затем

Notification n = builder.setPriority(Notification.DEFAULT_ALL).build();
n.defaults = 0;
n.defaults |= Notification.DEFAULT_VIBRATE;

Ответ 7

Я столкнулся с той же проблемой в 8.1 и сделал следующие изменения. Измените приоритет уведомления как LOW, и он отключит звук уведомления.

NotificationManager.IMPORTANCE_LOW

Код выглядит следующим образом:

NotificationChannel chan1 = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_LOW);

Ответ 8

NotificationManager.IMPORTANCE_LOW

Это будет работать, но также рухнуло ваше уведомление.

Ответ 9

NotificationManager.IMPORTANCE_LOW будет работать точно