以编程方式创建一个定期事件正在扼杀我(我需要在没有Calendar Intent的情况下这样做)。我一直在阅读很多帖子,但似乎没有什么对我有用。这是我目前的代码:
Calendar beginTime = Calendar.getInstance();
Calendar endTime = Calendar.getInstance();
Calendar reminderBeginTime = Calendar.getInstance();
long startMillis = 0;
long endMillis = 0;
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
long calID = 1;
values.put(CalendarContract.Events.CALENDAR_ID, calID);
values.put(CalendarContract.Events.TITLE, title);
values.put(CalendarContract.Events.EVENT_TIMEZONE, "Europe/London");
beginTime.set(2015, 0, 16, 9, 00);
startMillis = beginTime.getTimeInMillis();
endTime.set(2015, 0, 16, 24, 00);
endMillis = endTime.getTimeInMillis();
values.put(CalendarContract.Events.DTSTART, startMillis);
values.put(CalendarContract.Events.DTEND, endMillis);
values.put(CalendarContract.Events.RRULE, "FREQ=WEEKLY;UNTIL=20160116");
Uri eventUri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
此代码的结果有点不可预测。在定期规则中,我将定期的最终日期设置为2016年2月16日,但它只会创建重复性事件,直到2015年5月,或8月,有时是9月,4月......不知道为什么。
根据官方文件:
对于重复发生的事件,除了RRULE或RDATE之外,您还必须包含DURATION。请注意,如果您通过INSERT Intent插入事件(如在使用意图插入事件中所述),则该规则不适用 - 在该场景中,您可以将RRULE与DTSTART和DTEND结合使用,并且Calendar应用程序转换它自动到一个持续时间。
所以,我从RRULE中删除“Until = ...”并将持续时间添加10周,例如:
values.put(CalendarContract.Events.DURATION, "P10W");
但是应用程序崩溃了,记录下来了:
事件中不能同时拥有DTEND和DURATION
在某种程度上,我理解DTEND是一个特定事件结束的时刻,我不明白为什么我要删除它...无论如何,如果我删除它,它会每天都设置提醒和永久。< / p>
答案 0 :(得分:0)
可能有点晚了,但是我将答案留给仍然陷在这个问题中的任何人。
如您所说:
对于重复发生的事件,除了RRULE或RDATE外,还必须包括DURATION。请注意,如果您通过使用插入事件的意图中所述的INSERT意图插入事件,则该规则不适用-在这种情况下,您可以将RRULE与DTSTART和DTEND结合使用,并且Calendar应用程序将转换它会自动持续一段时间。
但是根据您的报价,
从某种意义上说,我将DTEND理解为特定事件结束的那一刻,我不明白为什么要删除它……无论如何,如果删除它,它会提醒人们每天和永远。< / p>
您似乎不了解CalendarContract.Event.DURATION
字段的含义。
在重复发生的事件中,将计算每个实例的DTEND加CalendarContract.Instance.DTSTART + CalendarContract.Instance.DURATION
。这是因为日历提供程序仅使用DTSTART来获取重复事件的实例并动态计算DTEND。
因此,当您将CalendarContract.Instance.DURATION
设置为“ P10w”时,您是在要求日历提供程序获得一个事件,该事件始于CalendarContract.Instance.DTSTART
起点,并在10周后结束。
该问题的一种解决方案是将持续时间设置为CalendarContract.Instance.DTSTART
和CalendarContract.Instance.DTEND
之间的毫秒差,使用CalendarContract.Instance.DURATION
P'difference / 1000'S