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