应用程序是否可以检查其是否被允许访问通知?

14

我希望实现一个NotificationListenerService来获取发布到通知栏的所有通知。

我了解需要使用以下调用在设置中启用对通知的访问:

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

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


1
一旦Android问题58030被合并,我们就不再需要在这里使用硬编码字符串了。希望它能尽快得到解决! - Charles Madere
https://stackoverflow.com/a/40185207/1696171 - Eric Cochran
4个回答

14
我设法找到了一个小技巧来解决这个问题。如果您检查 Settings.Secure 的源代码,您会发现 ENABLED_NOTIFICATION_LISTENERS 被注释为 @hide。我不知道这是否是有意为之。在相关话题上,CommonsWare 在另一个答案中提到,有一个bug阻止了此设置的启动,所以我想这可能是无意的。

无论如何,为了解决这个问题,我所做的就是使用ENABLED_NOTIFICATION_LISTENERS的字符串值获取当前已启用通知监听器的列表:

String enabledListeners = Settings.Secure.getString(context.getContentResolver(), 
    "enabled_notification_listeners");

那么你只需要检查一下你的服务是否在列表中。

我还没有在所有API >= 18上测试过这个,但是它可以在Android 4.4.2上工作。


1
检查您的服务是否在列表中非常容易,请查看我的答案:https://dev59.com/IWMl5IYBdhLWcg3wz5yS#21392852 - Charles Madere
1
在4.4.4上对我没用,但我在Genymotion模拟器上尝试了一下。 - user1406716

2

可能适用于API 19(4.4)及更高版本。 虽然我在API 21(5.0)上尝试过。

String enabledListeners = Settings.Secure.getString(context.getContentResolver(), 
"enabled_notification_listeners");

"

secured"正在变成红色。如果您想使用它,您必须使用:

"
String enabledNotificationListeners = 
  android.provider.Settings.Secure.getString(context.getContentResolver(), 
  "enabled_notification_listeners");

0

尝试:

NotificationManagerCompat.from(context).areNotificationsEnabled()

1
这是为了检查您的通知是否被Android在用户请求下阻止。问题涉及NotificationListenerService(检查是否可以监听通知)。 - Eric Cochran

0
在你的Service类中使用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;

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接