我已经使用以下代码为我的android应用程序中使用的每个日历获得了oAuth令牌
private HashMap<String, String> getAuthrizedCalendarsOnPhone() {
HashMap<String, String> authorized_calendars = new HashMap<String, String>();
AccountManager acctmgr = AccountManager.get(app_context);
Account[] accounts = acctmgr.getAccountsByType("com.google");
for (Account account : accounts) {
String auth_token_type = "oauth2:https://www.googleapis.com/auth/calendar";
AccountManagerFuture<Bundle> amf = acctmgr.getAuthToken(account, auth_token_type, null, this, null, null);
String authToken;
try {
Bundle authTokenBundle = amf.getResult();
authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);
} catch(Exception e) {
authToken = "";
}
authorized_calendars.put(account.name, authToken);
}
return authorized_calendars;
}
现在,我如何使用oAuth令牌实例化com.google.api.services.calendar.Calendar
对象,以便代表该用户访问日历api?
也就是说,这样我就可以做一些类似的事情
private HashMap<String, HCEvent> getCalendarEvents(String calendar_name) {
HashMap<String, HCEvent> return_map = new HashMap<String, HCEvent>();
com.google.api.services.calendar.Calendar service = null; //create a Calendar object using the oauth token for associated with calendar_name
com.google.api.services.calendar.model.Events events = service.events().list(calendar_name).setPageToken(pageToken).execute();
/*
* do something with the events
*/
return return_map;
}
在查看了一些Google Calendar API和示例后,将令牌分配给日历的最佳方式似乎是在初始化日历时。这需要一些设置,请查看以下链接:
https://developers.google.com/google-apps/calendar/instantiate
如果你已经经历过了,我很抱歉,但看起来你可以对这个例子做一些调整。
就在日历初始化之前,执行以下代码片段:
GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(
response.accessToken, httpTransport, jsonFactory, clientId, clientSecret,
response.refreshToken);
其又被用作日历初始化的一部分。
看看GoogleAccessProtectedResource的文档,似乎存在一个只接受访问令牌的构造函数。
http://javadoc.google-api-java-client.googlecode.com/hg/1.4.1-beta/com/google/api/client/googleapis/auth/oauth2/draft10/GoogleAccessProtectedResource.html#GoogleAccessProtectedResource(java.lang.String)
您可以使用之前在方法中已经请求的令牌,然后使用上面谷歌日历实例化链接中描述的其他几个对象,您应该能够使用给定的访问令牌正确地实例化日历。
希望这能有所帮助,
编辑
看起来GoogleAccessProtectedResource实际上将被弃用,或者已经被弃用。
javadoc声明:
"不推荐。(计划在1.8中删除)使用GoogleCredential"
http://javadoc.google-api-java-client.googlecode.com/hg/1.7.0-beta/com/google/api/client/googleapis/auth/oauth2/draft10/GoogleAccessProtectedResource.html
所以看起来你需要的是GoogleCredential来取代GoogleAccessProtectedResource。我发现你可以设置一个带有访问令牌的凭据,如下所示:
GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
然后您可以通过以下操作创建新日历:
Calendar service = new Calendar.Builder(httpTransport, jsonFactory,
credential).build();
httpTransport和jsonFactory与其他示例类似。
祝你好运!