我对Google Contacts API v3有疑问。我在下面说明了我所做的步骤。
实施认证机制:
公开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);
}
检索我的联系人:
查询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执行了相同的过程,并且它运行良好。
谢谢!
答案 0 :(得分:0)
在这种情况下,您正在使用Oauth和服务帐户。服务帐户有两个功能。 1.-帐户是否与应用程序相关联,您可以使用它来管理与应用程序相关的信息,如Drive Calendar等。
2.-冒充用户并代表他们行事。这仅适用于域帐户,并且仅在域管理员授予域wide delegation of authority的服务帐户权限后才可以。
在您的代码中,您正在进行身份验证作为服务帐户,而不是您自己的帐户。即使您在自己的开发者控制台中创建了服务帐户,服务帐户也无权访问您的信息。
因此,在这种情况下,您尝试检索您的服务帐户拥有的所有联系人,这些联系人都是无(除非您添加一些)。
要检索所有联系人,您必须使用“普通”Oauth而不是服务帐户。与您使用javascript但installed applications尝试使用的方式类似。