Android - 使用NotificationListener服务接收日历提醒通知

时间:2017-07-07 00:28:46

标签: java android notifications calendar

我使用NotificationListener服务有两个问题

  1. 我在我的应用中使用了NotificationListenerService类。此侦听器#onNotificationPosted方法接收所有通知。
  2. 我的代码如下

    public class MyListener extends NotificationListenerService 
    {
         public void onNotificationPosted(StatusBarNotification statusBarNotification)
         {
           //Receive all notification.
           // I need to receive reminder notification only
         }
     //.....
     ......
    }
    //My Manifiest like below
     <service
            android:name=".MyListener"
            android:enabled="true"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
            <intent-filter>
                <action android:name="android.service.notification.NotificationListenerService"/>
            </intent-filter>
        </service>
    

    但我只需要收到日历提醒通知。

    如何添加过滤器以仅接收日历提醒通知?

    1. 当我打开通知访问权限时,会显示以下消息

      允许MyApp通知访问?

      MyAPP将能够阅读所有通知,包括个人通知 联系人姓名和您的消息文本等信息 接收。它还可以解除通知或触发动作 它们包含的按钮

    2. 如何在通知访问对话框中更改上述消息?

2 个答案:

答案 0 :(得分:1)

  

如何添加过滤器以仅接收日历提醒通知?

public class ReminderListenerService extends NotificationListenerService {

    private static final String CALENDAR_PKG = "com.google.android.calendar";

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        final Notification noti = sbn.getNotification();
        // Filter for the Calendar application
        final boolean isCalendar = CALENDAR_PKG.equals(sbn.getPackageName());
        // Filter for Notification.CATEGORY_REMINDER (API 23+)
        final boolean isReminder = Notification.CATEGORY_REMINDER.equals(noti.category);
        // Retrieve the reminder
        final String reminder = noti.extras.getString(Notification.EXTRA_TITLE);
    }

}

<强>棒棒糖

就Google日历应用而言,我不确定如何在Lollipop中过滤提醒功能。使用Notification.CATEGORY_EVENT代替NotificationCompat.CATEGORY_REMINDER之类的内容。

  

如何在通知访问对话框中更改上述消息?

你做不到。但您可以显示自己的对话框,说明您需要访问的原因,然后使用以下命令将用户定向到通知侦听器设置:

startActivity(new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)

答案 1 :(得分:0)

<receiver
        android:name=".Calendar.CatchChangesReceiver"
        android:exported="true"
        android:priority="1000">
        <intent-filter>
            <!--   <action android:name="android.intent.action.PROVIDER_CHANGED" />-->
            <action android:name="android.intent.action.EVENT_REMINDER" />

            <data android:scheme="content" />
            <data android:host="com.android.calendar" />
        </intent-filter>
    </receiver>

公共类CatchChangesReceiver扩展了BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equalsIgnoreCase(CalendarContract.ACTION_EVENT_REMINDER)) {
        //Do Something Here to get EVENT ID
        Uri uri = intent.getData();
        String alertTime = uri.getLastPathSegment();
        String selection = CalendarContract.CalendarAlerts.ALARM_TIME + "=?";
        Cursor curs = context.getContentResolver().query(CalendarContract.CalendarAlerts.CONTENT_URI_BY_INSTANCE, new String[]{CalendarContract.CalendarAlerts.EVENT_ID, CalendarContract.CalendarAlerts.TITLE}, selection, new String[]{alertTime}, null);


    }

}

}