Android日历创建一种递归

时间:2016-02-04 18:21:27

标签: android recursion google-calendar-api icalendar

我遇到了以编程方式向Google日历添加事件的问题。

这是代码:

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 个答案:

答案 0 :(得分:1)

您已将主实例的结尾设置为重复规则的结尾。

第一个实例的持续时间为dataKeeper.getEnd() - beginTime。根据{{​​1}},此实例每天都会重复,直到RRULE

现在如果dataKeeper.getEnd()dataKeeper.getEnd()之后几天发生了,虽然第一天的第一个实例仍然在进行(因为它的持续时间为多天),但是当天开始另一个实例

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

因此,在beginTime的{​​{1}}日期之前添加了一个实例,之后每天实例数减少一个。

要修复它,请确保第一个实例只是一天。取代

UNTIL

通过

RRULE

这会将每个实例的持续时间设置为1天。无论如何,您应始终使用event.put(CalendarContract.Reminders.DTEND, dataKeeper.getEnd()); 作为重复活动,请参阅Events

顺便说一下,您还应该使用event.put(CalendarContract.Events.DURATION, "P1D"); 代替DURATION。虽然CalendarContract.Events也实现了CalendarContract.Reminders,但它意味着警报。我猜它包含事件列,因为它有效地从两个表的连接中读取。