(Оновлення 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
має недолік.
Коли ви використовуєте цей рівень важливості, ваше сповіщення більше не відображається повністю в панелі сповіщень, а вставляється в нову групу каналів сповіщень, яка за замовчуванням згортається (і сама згортається щоразу, коли шухляда висувається вниз). Який облом!
Оновлення 2: Копаючи трохи глибше, виявляється, ніби він правильно зареєстрував його як NotificationManager.IMPORTANCE_DEFAULT
, але якось чарівно оновився до NotificationManager.IMPORTANCE_HIGH
, як це було б, коли користувач явно змінює налаштування із типового на високий. Цей також отримує скидання за замовчуванням після вимкнення та повторного ввімкнення сповіщення.