Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java谷歌日历api“;“拒绝访问”;服务帐户_Java_Google Api_Google Calendar Api_Google Apps_Google Api Java Client - Fatal编程技术网

Java谷歌日历api“;“拒绝访问”;服务帐户

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

我正在尝试使用JavaGoogleCalendarAPI连接到日历。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坏 请求{“错误”:“访问被拒绝”}

我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();
       }