Android: установите «не беспокоить» (setInterruptionFilter) для всех уведомлений, кроме аудиопотока приложений

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

Поэтому мне нужно решение для отключения уведомлений во время воспроизведения звука. Я выяснил пока:

  • При предварительной настройке разрешений и указании пользователю разрешить приложению включить режим "Не беспокоить" с помощью

    startActivityForResult(new 
    Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS), 0);
    

    Я могу активировать режим «Не беспокоить» (DND) через

    NotificationManager.setInterruptionFilter(
        NotificationManager.INTERRUPTION_FILTER_NONE)
    

    но, который также отключит аудиопоток моего приложения. (см. 1)

  • блокировать телефонные звонки можно только тогда, когда у пользователя есть root-доступ. Я могу нет просить моих пользователей об этом, а также он не будет отключать другие уведомления

  • Я могу нет использовать режим полета, потому что приложению требуется Wi-Fi, чтобы запрашивать время через NTP из Интернета.

Вероятно, выход состоит в том, чтобы установить режим «Не беспокоить» вручную и затем запустить приложение и поток. Но как можно отправить пользователя прямо в меню «Не беспокоить», чтобы он мог включить режим «Не беспокоить» и вернуться в приложение, нажав кнопку «Назад»? Я нашел только Настройки-Действия:

    ACTION_NOTIFICATION_LISTENER_SETTINGS
    ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS
    ACTION_SOUND_SETTINGS

которые не подходят для этого. Может, это предусмотрено как-то для открытия быстрых настроек режима "Не беспокоить"?

Итак, чтобы сократить его, мне нужно сделать:

Пользователь запускает аудио -> пользователя спрашивают, хочет ли он активировать dnd без прерывания воспроизведения аудио -> начнется воспроизведение звука -> пользователь прекращает звук -> режим "Не беспокоить" отключен

Заранее благодарим за идеи по этому поводу!

Неужели никто не имеет представления о проблеме?

Niklas D 06.09.2018 16:02
1
1
1 426
2

Ответы 2

Вы в основном отключаете все звуки с помощью INTERRUPTION_FILTER_NONE. Используйте INTERRUPTION_FILTER_PRIORITY и настройте политику уведомлений, чтобы разрешить воспроизведение мультимедиа, как показано ниже:

NotificationManager.setInterruptionFilter(
   NotificationManager.INTERRUPTION_FILTER_PRIORITY );
NotificationManager.setNotificationPolicy(
   new NotificationManager.Policy( NotificationManager.Policy.PRIORITY_CATEGORY_MEDIA,
      0, 0 ) );

Вы также можете подавить некоторые эффекты, такие как освещение, добавив дополнительный параметр в setNotificationPolicy - подробности см. В справке Android.

Вы спаситель, спасибо, что разместили это.

Khay 01.10.2020 08:49

В Котлине это можно сделать как ..

 notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY)
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                    val policy =
                        NotificationManager.Policy(Policy.PRIORITY_CATEGORY_MEDIA, 0, 0)
                    notificationManager.notificationPolicy = policy
                }

ПРИМЕЧАНИЕ. Это возможно только в Android API уровня 28 и выше, поскольку в этот API была добавлена ​​политика PRIORITY_CATEGORY_MEDIA.

Есть и другие категории политик, которые могут быть полезны в других случаях. как PRIORITY_CATEGORY_REMINDERS, PRIORITY_CATEGORY_EVENTS, PRIORITY_CATEGORY_MESSAGES, PRIORITY_CATEGORY_CALLS, PRIORITY_CATEGORY_REPEAT_CALLERS и т. д. Подробнее о них здесь NotificationManager.Policy Официальный документ

Другие вопросы по теме