我遇到了以编程方式向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会发生。
答案 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
,但它意味着警报。我猜它包含事件列,因为它有效地从两个表的连接中读取。