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

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

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

4b9b3361

Ответ 1

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

Edit:

public static boolean isNotificationAccessEnabled = false;

@Override
public void onListenerConnected() {
    isNotificationAccessEnabled = true;
}

@Override
public void onListenerDisconnected() {
    isNotificationAccessEnabled = false;
}

Ответ 2

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

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

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

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


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

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

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();
}

Типичные значения, которые я видел для String enabledNotificationsListeners выглядят так:

  • Пользователь не дал ни одного из своих приложений.
    • null или ""
  • Пользователь дал одному приложению разрешение на доступ к Уведомлению
    • "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" из этого ответа.

Ответ 3

Просто используйте:

NotificationManagerCompat.from(context).areNotificationsEnabled()

работает как прелесть для меня.