我正在尝试使用Java Google Calendar api连接日历。 java应用程序使用服务帐户。
我有以下代码:
java.io.File licenseFile = new java.io.File("39790cb51b361f51cab6940d165c6cda4dc60177-privatekey.p12");
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("xxx@developer.gserviceaccount.com")
.setServiceAccountUser(EMAIL_ADRESS)
.setServiceAccountScopes(CalendarScopes.CALENDAR)
.setServiceAccountPrivateKeyFromP12File(licenseFile)
.build();
client = new com.google.api.services.calendar.Calendar.Builder(
HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName("Google Calendar Sync").build();
Calendar calendar = client.calendars().get(EMAIL_ADRESS).execute();
在最后一行,我收到一条带有消息的IOException:
ex =(com.google.api.client.auth.oauth2.TokenResponseException) com.google.api.client.auth.oauth2.TokenResponseException:400 Bad 请求{“error”:“access_denied”}
我检查了GoogleCredential对象的值并且它们是正确的。 我还在我的域控制台中添加了https://www.google.com/calendar/feeds/,http://www.google.com/calendar/feeds/,并将应用程序ID作为客户端来授权第三方应用程序访问
我忘记了一步吗?
答案 0 :(得分:1)
api尚未完成。更具体地说,是服务帐户部分。
日历所有者需要授予应用程序在其日历设置中读取/写入日历的权限。它可以在日历的共享设置中找到,您可以在其中添加帐户的电子邮件地址,并在日历上授予他们权限。
因此,在这种情况下,我必须将:xxx@developer.gserviceaccount.com添加到应用程序需要访问的日历的权限/共享列表中。
由于上述问题,我还删除了另一篇没有完整工作的帖子。我会取消删除它,因为它包含一些可能在将来帮助其他人的代码片段。但要注意不支持Google日历的权限问题和服务帐户
答案 1 :(得分:0)
我得到了它的工作
我不知道为什么,但我删除了这行
.setServiceAccountUser(EMAIL_ADRESS)
我还在域范围中添加了一个额外的URL:
https://apps-apis.google.com/a/feeds/calendar/resource/#readonly
并删除了无效的链接。
最后,我将客户端声明中的applicationName更改为与api控制台中的名称相同
client = new com.google.api.services.calendar.Calendar.Builder(
HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName("HolidaySyncs").build();
完成这些步骤后,它开始起作用。
在我这样做之后还要注意以后的参考我有以下错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "notFound",
"message": "Not Found"
}
],
"code": 404,
"message": "Not Found"
}
}
我通过改变例如:
来解决这个问题Event result = client.events().insert(<EMAIL ADRESS>, event).execute();
到
Event result = client.events().insert("primary", event).execute();
首先我认为谷歌服务器出了问题,但是当你尝试链接到日历ID时显然会出错。因此,链接到作为帐户主日历的“主要”工作。但是根据文档,当您引用特定的日历ID时,它也应该起作用,其中电子邮件地址是主日历。可能是一个错误?
更新:在这些代码更正之后,我仍然遇到了问题。阅读已接受的答案以获取更多信息。
答案 2 :(得分:0)
我做:
List find = client.events().list(EMAIL_ADRESS);
DateTime timeMin = new DateTime(DateUtil.stringToDate("01/01/2013"));
DateTime timeMax = new DateTime(DateUtil.stringToDate("01/02/2013"));
find.setTimeMin(timeMin);
find.setTimeMax(timeMax);
try{
Events events = find.execute();
int i =0;
while (true) {
System.out.println("Page: "+(++i)+": "+events.getItems().size());
for (Event event : events.getItems()) {
System.out.println(event.getSummary());
}
String pageToken = events.getNextPageToken();
if (pageToken != null && !pageToken.isEmpty()) {
events = client.events().list(EMAIL_ADRESS).setPageToken(pageToken).execute();
} else {
break;
}
}
}catch(GoogleJsonResponseException e){
System.out.println(e.getMessage());
// e.printStackTrace();
}