Android WearableCalendarContract查询不';不要返回重复发生的事件

Android WearableCalendarContract查询不';不要返回重复发生的事件,android,wear-os,android-calendar,Android,Wear Os,Android Calendar,我正在为Android Wear创建一个手表面,它将显示日历事件。基于(以及SDK中提供的WatchFace示例),我成功地查询了当天的下一个事件,并将它们显示在我的WatchFace上(下面是我用来查询事件的代码) 问题在于,重复事件不会在光标中返回,因此不会显示在手表表面上。是否有任何参数要添加到查询中以获取定期事件 private static final String[] PROJECTION = { CalendarContract.Calendars._ID, //

我正在为Android Wear创建一个手表面,它将显示日历事件。基于(以及SDK中提供的
WatchFace
示例),我成功地查询了当天的下一个事件,并将它们显示在我的WatchFace上(下面是我用来查询事件的代码)

问题在于,重复事件不会在光标中返回,因此不会显示在手表表面上。是否有任何参数要添加到查询中以获取定期事件

private static final String[] PROJECTION = {
        CalendarContract.Calendars._ID, // 0
        CalendarContract.Events.DTSTART, // 1
        CalendarContract.Events.DTEND, // 2
        CalendarContract.Events.DISPLAY_COLOR, // 3
};

protected List<SpiralEvent> queryEvents() {
    // event is a custom POJO object 
    List<Event> events = new ArrayList<>();

    long begin = System.currentTimeMillis();

    Uri.Builder builder = WearableCalendarContract.Instances.CONTENT_URI.buildUpon();
    ContentUris.appendId(builder, begin);
    ContentUris.appendId(builder, begin + DateUtils.DAY_IN_MILLIS);

    final Cursor cursor = mService.getContentResolver()
            .query(builder.build(),
                    PROJECTION,
                    null, // selection (all)
                    null, // selection args
                    null); // order

    // get the start and end time, and the color
    while (cursor.moveToNext()) {
        long start = cursor.getLong(1);
        long end = cursor.getLong(2);
        int color = cursor.getInt(3);
        events.add(new Event(start, end, color));
    }

    cursor.close();

    return events;
}
私有静态最终字符串[]投影={
CalendarContract.Calendars.\u ID,//0
CalendarContract.Events.DTSTART,//1
CalendarContract.Events.DTEND,//2
CalendarContract.Events.DISPLAY\u颜色,//3
};
受保护列表查询事件(){
//事件是一个自定义POJO对象
列表事件=新建ArrayList();
long begin=System.currentTimeMillis();
Uri.Builder=WearableCalendarContract.Instances.contentu Uri.buildOn();
appendId(生成器,开始);
ContentUris.appendId(生成器,begin+DateUtils.DAY,单位:毫秒);
最终游标=mService.getContentResolver()
.query(builder.build(),
预测
null,//所选内容(全部)
null,//选择参数
null);//顺序
//获取开始和结束时间以及颜色
while(cursor.moveToNext()){
long start=cursor.getLong(1);
long end=cursor.getLong(2);
int color=cursor.getInt(3);
添加(新事件(开始、结束、颜色));
}
cursor.close();
返回事件;
}

您必须使用
CalendarContract.Instances.BEGIN
而不是
CalendarContract.Events.DTSTART
;因此,您可以将
投影更改为:

private static final String[] PROJECTION = {
        CalendarContract.Calendars._ID, // 0
        CalendarContract.Events.BEGIN, // 1
        CalendarContract.Events.END, // 2
        CalendarContract.Events.DISPLAY_COLOR, // 3
};
原因是:

  • Events.DTSTART
    返回原始创建事件的开始时间。请注意,这一事件往往已成为过去;因此,它被过滤掉了
  • Events.BEGIN
    返回事件每个实例的开始时间

从my github示例项目中签出源代码。

您必须使用
CalendarContract.Instances.BEGIN
而不是
CalendarContract.Events.DTSTART
;因此,您可以将
投影更改为:

private static final String[] PROJECTION = {
        CalendarContract.Calendars._ID, // 0
        CalendarContract.Events.BEGIN, // 1
        CalendarContract.Events.END, // 2
        CalendarContract.Events.DISPLAY_COLOR, // 3
};
原因是:

  • Events.DTSTART
    返回原始创建事件的开始时间。请注意,这一事件往往已成为过去;因此,它被过滤掉了
  • Events.BEGIN
    返回事件每个实例的开始时间
从我的github示例项目中签出源代码