14

我想实现一个 NotificationListenerService 来访问发布到通知栏的所有通知。

我了解我需要通过此调用启用对“设置”中的通知的访问:

startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));

有没有办法检查用户是否为我的应用激活了通知访问权限?

4

4 回答 4

14

我设法找到了一个小技巧来解决这个问题。如果您检查 的来源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 上运行。

于 2013-12-13T20:17:00.253 回答
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");
于 2016-04-19T20:56:11.197 回答
0

尝试:

NotificationManagerCompat.from(context).areNotificationsEnabled()
于 2016-10-27T13:54:48.487 回答
0

在您的服务类中使用 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;

    }
}
于 2021-09-10T06:37:34.133 回答