我想实现一个 NotificationListenerService 来访问发布到通知栏的所有通知。
我了解我需要通过此调用启用对“设置”中的通知的访问:
startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
有没有办法检查用户是否为我的应用激活了通知访问权限?
我想实现一个 NotificationListenerService 来访问发布到通知栏的所有通知。
我了解我需要通过此调用启用对“设置”中的通知的访问:
startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
有没有办法检查用户是否为我的应用激活了通知访问权限?
我设法找到了一个小技巧来解决这个问题。如果您检查 的来源Settings.Secure
,您将看到用ENABLED_NOTIFICATION_LISTENERS
注释@hide
。我不知道这是不是故意的。在一个相关主题上,CommonsWare 在另一个答案中确实提到有一个错误阻止了此设置的启动,所以我想这是无意的。
无论如何,要解决这个问题,我所做的就是使用以下字符串值获取启用的通知侦听器的当前列表ENABLED_NOTIFICATION_LISTENERS
:
String enabledListeners = Settings.Secure.getString(context.getContentResolver(),
"enabled_notification_listeners");
然后你只需要检查你的服务是否在列表中。
我还没有在所有 API >= 18 上对此进行测试,但它正在 Android 4.4.2 上运行。
可能适用于 API 19 (4.4) 及更高版本。虽然我尝试过 API 21 (5.0)
String enabledListeners = Settings.Secure.getString(context.getContentResolver(),
"enabled_notification_listeners");
“安全”变成了红色。如果你想使用它,你必须使用:
String enabledNotificationListeners =
android.provider.Settings.Secure.getString(context.getContentResolver(),
"enabled_notification_listeners");
尝试:
NotificationManagerCompat.from(context).areNotificationsEnabled()
在您的服务类中使用 listnerConnected 布尔值
public class NotifyListener extends NotificationListenerService{
public static boolean listnerConnected = false;
@Override
public IBinder onBind(Intent intent) {
Log.d(name,"onBind Called");
listnerConnected = true;
return super.onBind(intent);
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.e("destroy", "called");
listnerConnected = false;
}
}