Получите время начала и окончания событий Календаря Google с помощью google-java-api-client в Android - PullRequest
4 голосов
/ 09 июня 2011

Как можно было бы проанализировать время начала и окончания событий в календаре пользователей Google с помощью google-api-java-client?

После установки этого образца Android-проекта из кода Google я могу войти в свой календарь Google и проанализировать некоторую информацию (например, все календари, названия событий, когда они были опубликованы, и сводную информацию). , но я не могу на всю жизнь получить время начала и окончания события.

Мое понимание кода таково.

Внутри основного класса активности (CalendarAndroidSample.java) этот метод получает заголовок для каждого из моих календарей:

void executeRefreshCalendars() {
String[] calendarNames;
List<CalendarEntry> calendars = this.calendars;
calendars.clear();
try {
  CalendarUrl url = CalendarUrl.forAllCalendarsFeed();
  // page through results
  while (true) {
    CalendarFeed feed = client.executeGetCalendarFeed(url);
    if (feed.calendars != null) {
      calendars.addAll(feed.calendars);
    }
    String nextLink = feed.getNextLink();
    if (nextLink == null) {
      break;
    }
  }
  int numCalendars = calendars.size();
  calendarNames = new String[numCalendars];
  for (int i = 0; i < numCalendars; i++) {
    calendarNames[i] = calendars.get(i).title;
  }
} catch (IOException e) {
  handleException(e);
  calendarNames = new String[] {e.getMessage()};
  calendars.clear();
}

Указанный выше цикл for назначает заголовок каждого календаря в моей учетной записи строковому массиву "calendarNames []."

Я выяснил, что в отдельном Java-файле внутри проекта (Entry.java), найденном здесь , аннотация @Key направляет код на синтаксический анализ элемента XML, и имя строки должно совпадать название элемента.

public class Entry implements Cloneable {

@Key
public String summary;

@Key
public String title;

@Key
public String updated;

@Key
public String published;

@Key("link")
public List<Link> links;

@Override
protected Entry clone() {
  try {
    @SuppressWarnings("unchecked")
    Entry result = (Entry) super.clone();
    Data.deepCopy(this, result);
    return result;
  } catch (CloneNotSupportedException e) {
    throw new IllegalStateException(e);
  }
}

String getEditLink() {
  return Link.find(links, "edit");
}
}

Так ....

  @Key
  public String published;

... найдет элемент в XML с именем «опубликованный» и присвоит значение этого элемента строке.

Таким образом, возвращаясь к первому ссылочному java-методу executeRefreshCalendars () (внутри CalendarAndroidSample.java), изменив

calendarNames[i] = calendars.get(i).title;

до

calendarNames[i] = calendars.get(i).published;

дает мне дату, когда событие было опубликовано.

Я думаю, что моя проблема с пониманием этого кода состоит в том, что для времени начала и окончания события данные находятся в элементе XML, который состоит из двух частей.

Может кто-нибудь помочь мне понять, как это сделать? У меня более 10 вкладок, открытых в моих браузерах, и я везде искал SO для получения помощи по этому вопросу, и самая близкая вещь, которую я могу найти, - это этот пост, но я не могу понять, как реализовать это с примером проекта, с которым я работаю.

Спасибо.

1 Ответ

3 голосов
/ 10 июня 2011

Вам нужно будет использовать EventFeed и взглянуть на класс EventEntry

http://code.google.com/p/google-api-java-client/source/browse/calendar-v2-atom-oauth-sample/src/com/google/api/client/sample/calendar/v2/model/EventEntry.java?repo=samples

Возвращенная строка Atom, содержащая startTime / endTime, будет выглядеть следующим образом:

<gd:when startTime='2010-03-13T14:00Z' endTime='2010-03-13T14:30Z'/>

Он моделируется в классе EventEntry следующим образом:

@Key("gd:when")
public When when;

(свойство объекта When, сопоставленного с помощью аннотации @Key)

Объект When,моделирование атрибутов start / endTime для объекта When

@Key("@startTime")
public DateTime startTime;

@Key("@endTime")
public DateTime endTime;

Код клиента при взаимодействии с eventFeed будет выглядеть следующим образом:

EventEntry event = eventFeed.get(0);
DateTime start = event.when.startDate;
...