Google 联系人 API v3,JAVA 获取所有联系人 "contactFeed.getEntries() is empty"!

Google Contacts API v3, JAVA GET ALL CONTACT "contactFeed.getEntries() is empty"!

我对 Google 通讯录 API v3 有疑问。我在下面说明了我所做的步骤。

  1. 正在通过 Google.
  2. 的控制台创建 client_id、file.p12
  3. 实现认证机制:

    public 联系人示例(){

      File p12 = new File("exampleContacts.p12");
    
      HttpTransport httpTransport =  GoogleNetHttpTransport.newTrustedTransport();
      GoogleCredential credential = new GoogleCredential.Builder()
              .setTransport(httpTransport)
              .setJsonFactory(JacksonFactory.getDefaultInstance())
              .setServiceAccountId("xxxxx@developer.gserviceaccount.com")
              .setServiceAccountPrivateKeyFromP12File(p12)
              .setServiceAccountScopes(Collections.singleton("https://www.google.com/m8/feeds/"))
              .build();
    
    
      if (!credential.refreshToken()) {
            throw new RuntimeException("Failed OAuth to refresh the token");
      }
      service.setOAuth2Credentials(credential);
    
      printAllContacts(service);
    

    }

  4. 检索我的联系人:

Query cQuery = new Query(new java.net.URL("https://www.google.com/m8/feeds/contacts/default/full")); cQuery.setMaxResults(10);

          ContactFeed feed = service.getFeed(cQuery, ContactFeed.class);

          for (ContactEntry contact : feed.getEntries()) {
              System.out.println("name: " + contact.getTitle().getPlainText());
          }

当我执行 ContactFeed feed = service.getFeed(cQuery, ContactFeed.class); 时,此方法 returns 一个空列表。少了什么?

我要补充一点,我已经在客户端使用 api JavaScript v3 执行了相同的过程,并且效果很好。

谢谢!

在这种情况下,您使用的是带有服务帐户的 Oauth。服务帐户有两个功能。 1.- 是与应用程序关联的帐户,您可以使用它来管理与应用程序相关的信息,例如Drive Calendar等

2.-冒充用户并代表他们行事。这仅适用于域帐户,并且仅在域管理员已授予域 wide delegation of authority 的服务帐户权限之后。

在您的代码中,您是作为服务帐户而不是您自己的帐户进行身份验证的。即使您在自己的开发者控制台中创建了服务帐户,该服务帐户也无法访问您的信息。

所以在这种情况下,您正在尝试检索您的服务帐户拥有的所有联系人,即 none(除非您添加一些)。

为了检索您的所有联系人,您必须使用 'normal' Oauth 而不是服务帐户。与您尝试使用 javascript 时所做的类似,但对于 installed applications.