Java谷歌日历api“;“拒绝访问”;服务帐户
我正在尝试使用JavaGoogleCalendarAPI连接到日历。java应用程序使用服务帐户 我有以下代码:Java谷歌日历api“;“拒绝访问”;服务帐户,java,google-api,google-calendar-api,google-apps,google-api-java-client,Java,Google Api,Google Calendar Api,Google Apps,Google Api Java Client,我正在尝试使用JavaGoogleCalendarAPI连接到日历。java应用程序使用服务帐户 我有以下代码: java.io.File licenseFile = new java.io.File("39790cb51b361f51cab6940d165c6cda4dc60177-privatekey.p12"); GoogleCredential credential = new GoogleCredential.Builder() .setTransport(HTTP
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坏
请求{“错误”:“访问被拒绝”}
我dubble检查了GoogleCredential对象的值,它们是正确的。
我还在我的域控制台中添加了,将应用程序id作为客户端,以授权第三方应用程序访问
我忘了一步了吗?我让它开始工作了
我不知道为什么,但我删除了这行
.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();
首先,我认为谷歌服务器有问题,但当你试图链接到日历ID时,显然出现了问题。因此,链接到“主”是帐户的主日历是可行的。但是根据文档,当您引用特定的日历ID时,它也应该起作用,其中电子邮件地址是主日历。可能是虫子
更新:在这些代码更正之后,我仍然有问题。阅读已接受的答案以了解更多信息。我愿意:
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();
}
api还没有完成。更具体地说,是服务帐户部分 日历所有者需要授予应用程序在其日历设置中读取/写入日历的权限。它位于日历的共享设置中,您可以在其中添加帐户的电子邮件地址,并在日历上授予他们权限 因此,在这种情况下,我必须补充:xxx@developer.gserviceaccount.com应用程序需要访问的日历的权限/共享列表
由于上述问题,我还删除了另一篇没有完全发挥作用的帖子。我将取消删除它,因为它包含一些可能在将来帮助其他人的代码片段。但是权限问题的beaware和不支持Google日历的服务帐户Hi,你们能让它工作吗?我正在用gmail scope进行尝试,但得到了相同的错误..我更新了答案;)谢谢,Gmail的服务帐户似乎不起作用,你介意指导我如何在android应用程序中使用它吗?我得到访问未配置错误,当我使用此代码时,在生成凭证时,我得到一个空指针异常。请协助史提芬,你说“服务帐户不支持谷歌日历”,所以我们不能使用服务帐户检索某人的谷歌日历事件,即使她/他/管理员已经授予我们权限吗?
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();
}