Проверить доступ к уведомлениям с помощью NotificationListenerService

Я пользуюсь службой> = 4.3 NotificationListenerService для доступа к уведомлениям. При первом запуске мое приложение выводит пользователя на системную панель «Уведомления о доступе», но я хотел бы пригласить пользователя там, где установлен флажок для моего приложения в «Уведомлениях о доступе». Я не нашел isNotificationAccessEnabled() любом месте, но я определенно знаю, что это возможно, потому что такие приложения, как Krome , тоже делают это.

Im разработчик Krome. Что я сделал, чтобы проверить, включена ли служба, добавьте общедоступную статическую переменную, которая изменяется на true в методе onBind и false в unbind. Так работает эта услуга.

Редактировать:

 public static boolean isNotificationAccessEnabled = false; @Override public void onListenerConnected() { isNotificationAccessEnabled = true; } @Override public void onListenerDisconnected() { isNotificationAccessEnabled = false; } 

Редактировать 15 июня 2016 года

Я не уверен, какая версия библиотеки поддержки была добавлена, но похоже, что теперь эта функция встроена. Просто используйте:

NotificationManagerCompat.getEnabledListenerPackages(context); ( ссылка на документы )

Это возвращает Set который вы можете перебирать, чтобы найти имя вашего пакета. Обратите внимание, однако, что я лично не проверял это. Но похоже, что, вероятно, предпочтительнее использовать это вместо моего старого решения ниже.


Старое решение

Этот код работает для моего приложения:

 ContentResolver contentResolver = context.getContentResolver(); String enabledNotificationListeners = Settings.Secure.getString(contentResolver, "enabled_notification_listeners"); String packageName = context.getPackageName(); // check to see if the enabledNotificationListeners String contains our package name if (enabledNotificationListeners == null || !enabledNotificationListeners.contains(packageName)) { // in this situation we know that the user has not granted the app the Notification access permission throw new Exception(); } else { doSomethingThatRequiresNotificationAccessPermission(); } 

enabledNotificationListeners String имеет значение null когда есть нулевые прослушиватели уведомлений, поэтому нулевая проверка.

Типичные значения, которые я видел для enabledNotificationsListeners String выглядят следующим образом:

  • Пользователь не предоставил никому из своих приложений.
    • "" (пустая String )
  • Пользователь предоставил одно приложение Разрешение доступа к уведомлению
    • "com.woodblockwithoutco.remotecontrollerexample/com.woodblockwithoutco.remotecontrollerexample.RemoteControlService"
  • Пользователь предоставил два разрешения на доступ к уведомлениям
    • "com.scootrnova.android/com.scootrnova.android.ListenerService:com.woodblockwithoutco.remotecontrollerexample/com.woodblockwithoutco.remotecontrollerexample.RemoteControlService"

Эта реализация очень проста и отлично работает 🙂

PS У меня возникла идея использовать жестко закодированную строку «enabled_notification_listeners» из этого ответа .

  • PendingIntent работает правильно для первого уведомления, но неправильно для остальных
  • Как нарисовать представление поверх всего?
  • Извлечение текста извещных, contentView или contentIntent
  • Определите addAction для уведомлений Android
  • Android - создайте уведомление, TaskStackBuilder.addParentStack не работает
  • Android: удалить уведомление из панели уведомлений
  • Отключить звук из NotificationChannel
  • android: запуск фоновой задачи с помощью AlarmManager
  • Откройте приложение после нажатия кнопки «Уведомление»
  • Обнаруживать новое уведомление для Android
  • Как реализовать устаревшие методы уведомления
  • Давайте будем гением компьютера.