【问题标题】:Android: Creating recurring event programmaticallyAndroid:以编程方式创建重复事件
【发布时间】:2015-01-16 17:11:56
【问题描述】:

以编程方式创建重复事件让我很生气(我需要在没有日历意图的情况下这样做)。我一直在阅读很多帖子,但似乎没有什么对我完全有效。这是我当前的代码:

    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 结合使用,并且日历应用程序会转换它会自动持续一段时间。

因此,我从 RRULE 中删除了“Until=...”,并添加了 10 周的持续时间,例如:

values.put(CalendarContract.Events.DURATION, "P10W");

但应用程序崩溃,记录如下:

一个事件中不能同时包含 DTEND 和 DURATION

在某种程度上,我将 DTEND 理解为特定事件结束的时刻,我不明白为什么我必须删除它......无论如何,如果我删除它,它会每天和永远设置提醒。

【问题讨论】:

标签: android android-activity calendar


【解决方案1】:

可能有点晚了,但我会将答案留给仍然陷入此问题的任何人。

如你所说:

对于重复事件,除了 RRULE 或 RDATE 之外,您还必须包含 DURATION。请注意,如果您通过 INSERT Intent 插入事件,则此规则不适用,如使用意图插入事件中所述 - 在这种情况下,您可以将 RRULE 与 DTSTART 和 DTEND 结合使用,并且日历应用程序会转换它会自动持续一段时间。

但是根据你的报价,

在某种程度上,我将 DTEND 理解为特定事件结束的时刻,我不明白为什么我必须删除它......无论如何,如果我删除它,它会每天和永远设置提醒。

您似乎不了解字段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

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2018-05-03
    • 2012-05-01
    相关资源
    最近更新 更多