Google Contacts API v3,JAVA GET ALL CONTACT“contactFeed.getEntries()为空”!

时间:2015-10-20 15:07:50

标签: java google-api google-contacts google-api-v3

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

  1. 通过Google控制台创建client_id,file.p12。
  2. 实施认证机制:

    公开ContactsExample(){

      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);
    

    }

  3. 检索我的联系人:

  4. 查询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);时,此方法返回一个空列表。缺少什么?

    我想补充一点,我在客户端使用api JavaScript v3执行了相同的过程,并且它运行良好。

    谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

因此,在这种情况下,您尝试检索您的服务帐户拥有的所有联系人,这些联系人都是无(除非您添加一些)。

要检索所有联系人,您必须使用“普通”Oauth而不是服务帐户。与您使用javascript但installed applications尝试使用的方式类似。