2016-02-04 96 views
0

我遇到了以事件方式向Google日历添加事件的问题。Android日历创建递归类型

这里是代码:

private void addToGoogleCalendar(long beginTime) { 
    ContentValues event = new ContentValues(); 
    Observable.from(dataKeeper.getCalendarIds().keySet()).filter(key -> dataKeeper.getCalendarIds().get(key).equals(defaultCalendarName.getText().toString())).forEach(key -> 
      event.put(CalendarContract.Reminders.CALENDAR_ID, Integer.parseInt(key)) 
    ); 

    event.put(CalendarContract.Reminders.TITLE, reminderName.getText().toString()); 

    if (!TextUtils.isEmpty(commentEdittext.getText().toString())) 
     event.put(CalendarContract.Reminders.DESCRIPTION, commentEdittext.getText().toString()); 

    event.put(CalendarContract.Reminders.EVENT_TIMEZONE, TimeZone.getDefault().getID()); 
    event.put(CalendarContract.Reminders.DTSTART, beginTime); 
    event.put(CalendarContract.Reminders.DTEND, dataKeeper.getEnd()); 
    event.put(CalendarContract.Reminders.EVENT_COLOR, getResources().getColor(R.color.primary)); 

    // http://tools.ietf.org/html/rfc2445 
    if (dataKeeper.getPeriod() > 0 && dataKeeper.getPeriod() != 7) 
     event.put(CalendarContract.Reminders.RRULE, String.format("FREQ=DAILY;INTERVAL=%d;UNTIL=%s", dataKeeper.getPeriod() - 1, 
       new SimpleDateFormat("yyyyMMdd", Locale.getDefault()).format(dataKeeper.getEnd()))); 
    else if (dataKeeper.getPeriod() == 7) 
     event.put(CalendarContract.Reminders.RRULE, String.format("FREQ=WEEKLY;INTERVAL=1;UNTIL=%s", 
       new SimpleDateFormat("yyyyMMdd", Locale.getDefault()).format(dataKeeper.getEnd()))); 

    event.put(CalendarContract.Reminders.ALL_DAY, 1); // 0 for false, 1 for true 
    event.put(CalendarContract.Reminders.STATUS, CalendarContract.Events.STATUS_CONFIRMED); 

    String eventUriString = "content://com.android.calendar/events"; 
    getContentResolver().insert(Uri.parse(eventUriString), event); 
} 

Inrerval = 1

所以,当我添加事件,它增加的需求,但在几秒钟内我看到的事件增加了递归。第一天一次,第二天两次等等。

只调用方法,所以我不知道WTF发生。

enter image description here

回答

1

你设置了主实例年底复发统治的结束。

第一种情况的持续时间为dataKeeper.getEnd() - beginTime。按照RRULE这种情况下是重复出现的每一天,直到dataKeeper.getEnd()

现在,如果dataKeeper.getEnd()是几天beginTime后碰巧的是,虽然拳头实例是第二天仍在进行中(因为它具有多天的持续时间),另一实例在当天开始。

在第三天,前两个实例仍在继续,规则说另一个应该开始。

因此,有一个实例添加到UNTIL日期RRULE之后,此后实例数量每天减少一个。

要修复它,请确保第一个实例只有一天。通过

event.put(CalendarContract.Events.DURATION, "P1D"); 

此设置每个实例的持续时间为1天更换

event.put(CalendarContract.Reminders.DTEND, dataKeeper.getEnd()); 

。无论如何,您总是应该使用DURATION进行重复性活动,请参阅Events

顺便说一句,你还应该使用CalendarContract.Events而不是CalendarContract.Reminders。虽然Reminders也实现EventsColumns它是为了报警。我想它包含事件列,因为它有效地从两个表上的连接读取。