Google 联系人 API v3,JAVA 获取所有联系人 "contactFeed.getEntries() is empty"!
Google Contacts API v3, JAVA GET ALL CONTACT "contactFeed.getEntries() is empty"!
我对 Google 通讯录 API v3 有疑问。我在下面说明了我所做的步骤。
- 正在通过 Google.
的控制台创建 client_id、file.p12
实现认证机制:
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);
}
检索我的联系人:
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.
我对 Google 通讯录 API v3 有疑问。我在下面说明了我所做的步骤。
- 正在通过 Google. 的控制台创建 client_id、file.p12
实现认证机制:
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);
}
检索我的联系人:
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.