【问题标题】:New Calendars created with API and Service account are not visible使用 API 和服务帐户创建的新日历不可见
【发布时间】:2013-09-14 14:50:39
【问题描述】:

我正在使用 Google Calendar API v3 和服务帐户模式开发一个应用程序以获取访问权限。我的应用程序似乎能够毫无问题地创建新日历,但是当我要使用 Google 日历标准网络应用程序检查结果时,我什么也看不到。这很奇怪,因为获取 CalendarList 会返回正确的日历列表。 有人知道为什么会这样吗?使用服务帐户创建的日历存在一些限制?

感谢您的帮助。 阿尔贝托

更新 1:

这是我的代码的 sn-p

HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountScopes(Collections.singleton(CalendarScopes.CALENDAR))
            .setServiceAccountPrivateKeyFromP12File(new File(KEY_P12))
            // .setServiceAccountUser("user@example.com")
            .build();

         Calendar service = new com.google.api.services.calendar.Calendar.Builder(httpTransport, JSON_FACTORY, credential)
            .setApplicationName(APPLICATION_NAME).build();

        com.google.api.services.calendar.model.Calendar content = new com.google.api.services.calendar.model.Calendar();
        content.setSummary("A calendar");
        service.calendars().insert(content).execute();

更新 2:

有人建议我将服务帐户用户添加到凭据中(然后取消注释.setServiceAccountUser("user@example.com") 上面的代码,但它不起作用。在这种情况下,我既不能创建日历,我也会收到打电话给service.calendars().insert(content).execute(); 我收到了

400 Bad Request
{
  "error" : "access_denied"
}

【问题讨论】:

标签: java google-api google-calendar-api google-api-java-client service-accounts


【解决方案1】:

使用CalendarList.get()函数确认日历不在用户日历列表中的hidden=true

【讨论】:

  • 嗨 Jay,我尝试了你的建议并打印了结果 service().calendarList().get(calendarId).execute().toPrettyString(); { “accessRole”:“所有者”,“backgroundColor”:“#fa573c”,“colorId”:“4”,“etag”:“\”HvdNzJLFsPN6WzLOxlO1URKnJIE/ji0r5Uh3FsdbdNcKGxyRG7OA8​​n8\“”,“foregroundColor”:“#000000”,“ id”:“mo012ecmkf3mrqmp5hjctj630s@group.calendar.google.com”,“kind”:“calendar#calendarListEntry”,“selected”:true,“summary”:“deviceId”,“timeZone”:“UTC”} 也许是因为我使用 G API 的新手,但我无法检索“隐藏”值
  • 我深入研究了api,隐藏的值为null然后CalendarListEntry#isHidden方法返回false:-\
【解决方案2】:

我认为您的 GoogleCredential 不完整。尝试使用 ClientSecrets 并刷新令牌。

    List<String> scopes = new ArrayList<String>();
    scopes.add("https://www.google.com/m8/feeds/");
    GoogleCredential credential = new  GoogleCredential.Builder()
    .setTransport(new NetHttpTransport())
    .setJsonFactory( new JacksonFactory())
    .setServiceAccountId("id@developer.gserviceaccount.com")
    .setServiceAccountPrivateKeyFromP12File(new File("privatekey.p12"))
    .setClientSecrets("clientID", "clientSecret")
    .setServiceAccountScopes(scopes)
    .build();
    credential.refreshToken();

问候

【讨论】:

  • 您从哪里获得这些值:clientIDclientSecret?此外,Java 客户端似乎拥有创建日历所需的所有凭据,那么它的凭据怎么可能不完整呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2019-06-10
  • 2021-09-30
  • 2021-03-29
  • 2017-06-23
  • 2023-04-09
相关资源
最近更新 更多