2016-02-04 81 views
0

我遇到了以事件方式向Google日曆添加事件的問題。Android日曆創建遞歸類型

這裏是代碼:

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

你設置了主實例年底復發統治的結束。

第一種情況的持續時間爲dataKeeper.getEnd() - beginTime。按照RRULE這種情況下是重複出現的每一天,直到dataKeeper.getEnd()

現在,如果dataKeeper.getEnd()是幾天beginTime後碰巧的是,雖然拳頭實例是第二天仍在進行中(因爲它具有多天的持續時間),另一實例在當天開始。

在第三天,前兩個實例仍在繼續,規則說另一個應該開始。

因此,有一個實例添加到UNTIL日期RRULE之後,此後實例數量每天減少一個。

要修復它,請確保第一個實例只有一天。通過

event.put(CalendarContract.Events.DURATION, "P1D"); 

此設置每個實例的持續時間爲1天更換

event.put(CalendarContract.Reminders.DTEND, dataKeeper.getEnd()); 

。無論如何,您總是應該使用DURATION進行重複性活動,請參閱Events

順便說一句,你還應該使用CalendarContract.Events而不是CalendarContract.Reminders。雖然Reminders也實現EventsColumns它是爲了報警。我想它包含事件列,因爲它有效地從兩個表上的連接讀取。