Android:以编程方式创建定期事件

时间:2015-01-16 17:11:57

标签: android android-activity calendar

以编程方式创建一个定期事件正在扼杀我(我需要在没有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>

1 个答案:

答案 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.DTSTARTCalendarContract.Instance.DTEND之间的毫秒差,使用CalendarContract.Instance.DURATION P'difference / 1000'S