无法使用NotificationListenerService取消通知

3
这是我的服务:
public class Listener extends NotificationListenerService {
    Context context;

    @Override

    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    @Override

    public void onNotificationPosted(StatusBarNotification sbn) {
        String pack = sbn.getPackageName();
        String ticker = sbn.getNotification().tickerText.toString();
        Bundle extras = sbn.getNotification().extras;
        String title = extras.getString("android.title");
        String text = extras.getCharSequence("android.text").toString();

        Log.i("Msg",pack);
        Log.i("Msg",ticker);
        Log.i("Msg",title);
        Log.i("Msg",text);

        Intent msgrcv = new Intent("Msg");
        msgrcv.putExtra("package", pack);
        msgrcv.putExtra("ticker", ticker);
        msgrcv.putExtra("title", title);
        msgrcv.putExtra("text", text);
            LocalBroadcastManager.getInstance(context).sendBroadcast(msgrcv);
        Toast.makeText(context, "GOT SOMETHING", Toast.LENGTH_LONG).show();

 //final String T=  sbn.getKey();

        Listener.this.cancelAllNotifications();
    }

    @Override

    public void onNotificationRemoved(StatusBarNotification sbn) {
        Log.i("Msg","Notification Removed");
    }
}

为了测试,我想要在通知到达时立即 关闭来自任何应用的所有通知。我已经在 onNotificationPosted 中调用了 Listener.this.cancelAllNotifications();,但它没有起作用。

我做错了什么?我正在 Android 版本 5.0.2 上进行测试。

P.S.

我已经按照 Android 的说明添加了权限和意图过滤器。

<service android:name=".NotificationListener"
          android:label="@string/service_name"
          android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
     <intent-filter>
         <action android:name="android.service.notification.NotificationListenerService" />
     </intent-filter>
 </service>
2个回答

1
请确保实现您的NotificationListenerService的应用程序的“通知访问”处于活动状态(选中)。

可以在“设置”菜单中进行验证。根据Android版本的不同,它位于以下任一地址。对于Android 5.0,它应该在: 设置 -> 声音和通知 -> 通知访问

否则,您可能会在以下位置找到它: 设置 -> 安全性 -> 通知访问

尝试为您的应用启用它,然后尝试清除通知。


难道没有其他的方法可以通过编程来启用该选项,而不是触发一个意图来打开设置页面并让用户自己进行操作吗?顺便说一句,应该标记为答案! - Mohammed AlBanna
不,它需要用户采取行动才能启用它,就像启用应用程序的Dev Admin一样。 - Neji

0
关于如何让用户启用其通知访问权限,
您可以显示一个弹出窗口(“请启用通知访问权限”),当用户点击“确定”时,它将重定向用户到设置页面,以启用通知访问权限设置。
private static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";

private void openNotificationAccess() {
    startActivity(new Intent(ACTION_NOTIFICATION_LISTENER_SETTINGS));
}

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