使用API​​和服务帐户创建的新日历不可见

时间:2013-09-14 14:50:39

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

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

感谢您的帮助。 阿尔贝托

更新1:

这是我的代码片段

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"
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为您的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();

此致