получить исключение при вставке событий в календарь Android

1

Я вставляю события в свой календарь Android. следующий код:

ContentValues event = new ContentValues();
    event.put("calendar_id", calId);
    event.put("title", "Event Title");
    event.put("description", "Event Desc");
    event.put("eventLocation", "Event Location");
    event.put("allDay", 1);
    event.put("eventStatus", 1);
    event.put("visibility", 0);
    event.put("transparency", 0);
    event.put("hasAlarm", 1);

    Date d = new Date();
    d.setHours(8);
    d.setMinutes(30);
    d.setSeconds(30);
    long startTime = d.getTime();
    d.setHours(12);
    d.setMinutes(30);
    d.setSeconds(20);
    long endTime = d.getTime();
    event.put("dtstart", startTime);
    // event.put("dtend", endTime);
    event.put("rrule", "FREQ=DAILY;WKST=SU");
    // event.put("lastDate", endTime);
    // event.put("timezone", "Asia/Karachi");
    //event.put("duration", "P3600S");

    //Calendar gmtC = new GregorianCalendar(TimeZone.getTimeZone("Asia/Karachi"));



    // event.put("transparency", 0);
    // event.put("hasAlarm", 1); // 0 for false, 1 for true
    Uri eventsUri = Uri.parse("content://calendar/events");
    Uri url = getContentResolver().insert(eventsUri, event);

Я получаю следующее исключение:

java.lang.IllegalArgumentException: allDay is true but sec, min, hour are not 0.

нужна помощь!

  • 0
    Поставщик контента, который вы используете, не является частью Android SDK. Ваш код сломается на некоторых устройствах, которые не включают приложение Календарь AOSP или изменили его. Ваш код может сломаться в будущих версиях Android. Пожалуйста, используйте Google GData API для управления календарем пользователя.
  • 1
    дорогой, я знаю все эти вещи, но в настоящее время мне нужно решить эту проблему.
Показать ещё 5 комментариев
Теги:
calendar
gdata
gdata-api

5 ответов

4

Я столкнулся с той же проблемой, даже с часами, минутами и секундами, установленными в 0. Затем я обнаружил, что для событий allday время должно быть установлено в UTC. Это означает, что вам нужно добавить UTC-смещение часового пояса календаря к вашему стартовому времени события allday.

Например: (часовой пояс и startTime только для жесткого кодирования!)

// You should write a method to get the calendar timezone through a query
String calendarTimezone = "CET";

// Start time of the event. Hours, minutes and seconds have to be 0.
long startTime = 1315087200000L; // equals 2011-09-04 00:00:00

// Get UTC offset for the given timezone and start time. This way DST is accounted for.
int timeZoneOffset = TimeZone.getTimeZone(calendarTimezone).getOffset(startTime);

// Set same time for start and end of the allday event. Add UTC offset.
event.put("dtstart", startTime + timeZoneOffset);
event.put("dtend", startTime + timeZoneOffset);
event.put("allDay", 1);
1

Если для allDay установлено значение 1 eventTimezone должно быть TIMEZONE_UTC, а время должно соответствовать полуночной границе, значит час, минута, секунда должны быть равны нулю календарного объекта.

ссылайтесь на следующую ссылку..

http://developer.android.com/reference/android/provider/CalendarContract.Events.html

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));           
cal.set(2014, 03, 18, 0, 0,0);
1

API-интерфейс GData для календаря определяет событие в течение всего дня с временем начала только даты и конечным временем дня после окончания события.

Это данные, отправленные в данные Google api

<entry xmlns='http://www.w3.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'>

  <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/g/2005#event'></category>
  <title type='text'>Word of the Day</title>
  <gd:when startTime='2007-07-17'
    endTime='2007-07-18'></gd:when>

</entry>

Обратите внимание, что время начала и окончания не содержит в себе никакой информации о времени.

У вас НЕ МОЖЕТЕ иметь событие в течение всего дня, которое не начинается в полночь. Вот почему вы получаете исключение. час, мин, сек ДОЛЖНЫ быть 0 для них в течение всего дня.

Вы можете попробовать другой форум, но вы всегда получите этот ответ, потому что так работает API GData.

  • 0
    Как я могу использовать код, который вы упомянули выше. пожалуйста, предоставьте мне пример кода, если у вас есть.
  • 0
    Версия 2.0 библиотеки GDATA поддерживает Android. code.google.com/p/gdata-java-client вы можете получить его там. и документы находятся по адресу code.google.com/apis/calendar/data/2.0/…
Показать ещё 7 комментариев
0

rob правильно! Вы должны определить события allday в UTC. Следующий код немного лучше, чем версия robs:

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.setTimeZone(TimeZone.getTimeZone("UTC"));

    long dtstart = cal.getTimeInMillis();

    builder.withValue(Events.DTSTART, dtstart);
0

вы указываете "allDay" как истинный, но вы устанавливаете время с секундами, минутами и часами. Это означает, что для системы это не весь день... попробуйте удалить либо allDay, либо установить время. Возможно, они противоположны и противоречивы.

  • 0
    Хорошо, я ожидаю того же ответа от этого форума. Я знаю, что могу добавлять простые события в календарь. Но я хочу добавить целый день повторения события. Сейчас я попробую другой форум.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню