我正在使用> = 4.3 NotificationListenerService
来访问通知。在第一次启动时,我的应用程序将用户带到“访问通知”系统面板,但是只要禁用“访问通知”中我的应用程序的复选框,我就会将用户带到那里。我没有在任何地方找到isNotificationAccessEnabled()
方法,但我绝对知道这是可能的,因为像Krome这样的应用程序也这样做。
我是Krome的开发者。我做了什么来检查是否启用了服务是添加公共静态变量,在onBind方法中变为true,在unbind中变为false。这就是这项服务的工作方式。
编辑:
public static boolean isNotificationAccessEnabled = false;
@Override
public void onListenerConnected() {
isNotificationAccessEnabled = true;
}
@Override
public void onListenerDisconnected() {
isNotificationAccessEnabled = false;
}
我不确定添加了哪个版本的the support library,但看起来现在内置了这个功能。只需使用:
NotificationManagerCompat.getEnabledListenerPackages(context);
(link to docs)
这将返回一个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();
}
我在enabledNotificationsListeners
String
上看到的典型值看起来像这样:
null
或""
"com.woodblockwithoutco.remotecontrollerexample/com.woodblockwithoutco.remotecontrollerexample.RemoteControlService"
"com.scootrnova.android/com.scootrnova.android.ListenerService:com.woodblockwithoutco.remotecontrollerexample/com.woodblockwithoutco.remotecontrollerexample.RemoteControlService"
这个实现非常简单,效果很好:)
附:我有想法使用来自this answer的硬编码“enabled_notification_listeners”字符串。