Android下使用googleapi-client-java操作google calendar(三)

4.获取日历列表并显示:
原理:向https://www.google.com/calendar/feeds/allcalendars/full发送GET请求然后解析响应。
发送时牵扯到HTTP Header生成,重定向以及把数据解析成为Java对象等操作,这些库函数都提供了接口可用。
在googleapi-client-api的例子中提供了一个model,此model对库的接口针对calendar又进行了一次封装,可以直接复制到代码中使用。
4.1 CalendarUrl类:继承自GoogleUrl,扩展了一些获取url的函数。
CalendarUrl url = CalendarUrl.forAllCalendarsFeed(); //构造获取feed的url串。如果要删除日历,那么这儿要换成forOwnCalendarsFeed(),否则删除时会返回http 500错误。
4.2 CalendarFeed类:定义了一个成员变量,是calendar的列表,通过Java Annotation,库函数可以通过反射机制取到这个变量,并将解析后的CalendarEntry填充到此列表中来。
CalendarFeed feed = CalendarFeed.executeGet(mTransport, url); //从网络获取数据并解析成feed对象。
4.3 在列表中显示:
calendarNames = new String[numCalendars];
for (int i = 0; i < numCalendars; i++) {
calendarNames[i] = calendars.get(i).title; //更新数组
}
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, calendarNames)); //更新列表。

5.获取某个日历的事件列表并显示:
向日历所保存的事件url发送get请求。
CalendarEntry calendar = mCalendars.get(position);
CalendarUrl url = new CalendarUrl(calendar.getEventFeedLink()); //获得event url
EventFeed efeed = EventFeed.executeGet(mTransport, url); //发送请求,从网络获得event feed
在EventFeed中保存了所有entry列表,可以通过EvnentFeed.getEntries()来获得。

6.日历操作:
6.1 添加日历:
原理:向https://www.google.com/calendar/feeds/owncalendars/full发送数据。
获取目标url:
CalendarUrl url = CalendarUrl.forOwnCalendarsFeed();
创建新的日历对象:
CalendarEntry ncalendar = new CalendarEntry();
设置标题:
ncalendar.title = "Calendar " + new DateTime(new Date());
执行插入操作:
ncalendar.executeInsert(mTransport, url);
6.2 删除日历:
原理:向calendar entry的编辑url发送HTTP DELETE请求。这个编辑url是服务器返回并被解析后保存在calendar对象中的。
获取要删除的日历对象,执行删除操作。
calendar.executeDelete(mTransport);
6.3 修改日历:
原理:向calendar entry的编辑url发送HTTP PATCH请求。
从原日历clone一个对象,然后执行patch函数。
CalendarEntry patchedCalendar = calendar.clone();
//modify
patchedCalendar.title = calendar.title + " UPDATED " + new DateTime(new Date());
//更新到网络
patchedCalendar.executePatchRelativeToOriginal(mTransport, calendar);
6.4 添加事件:
原理:向所属的calendar的event feed url发送数据。
event = new EventEntry();
event.title = "title";
When when = new When();
when.startTime = new DateTime(new Data());
event.when = when;
CalendarUrl url = new CalendarUrl(calendar.getEventFeedLink());
event.executeInsert(mTransport, url);
6.5 删除事件:
原理:发送DELETE请求。
event.executeDelete(mTransport);
需要注意的是执行delete时我收到的结果是403,始终不能成功删除。
以“google api client delete calendar event forbidden"搜索发现此问题别人也有遇到,查阅资料:
http://code.google.com/apis/gdata/docs/2.0/basics.html
在Deleting an entry一节提到:
To do an unconditional delete, set the following HTTP header:If-Match: *
所以需要修改executeDelete函数,补充一行:request.headers.ifMatch = "*";
正常应该是ifMatch=etag,etag的作用参见Updating an entry一节:
You also have to specify the original entry's ETag, to ensure that you don't overwrite anyone else's changes.
以上理解未必正确,如有指教可直接回复。
6.6 修改事件:
event.executePatchRelativeToOriginal(mTransport, event);
同样也要修改一下executePatchRelativeToOriginal函数,增加:
request.headers.ifMatch = "*";
对于删除Calendar以及修改Calendar这一行加不加没影响。

仓促成文,附件的例子也有一些冗余代码未修改,日后再加工。

你可能感兴趣的:(java,android,Google)