正在 Android 中获取用户的 "other" Google 联系人
Fetching a user's "other" Google contacts in Android
如果我理解正确,为了从我的 Android 应用中获取用户 Google 联系人,我应该使用 People API instead of the Contacts API. In my case, I want to get all user's contacts including the "other contacts", as shown in the figure below (one can see his/her other contacts by clicking on the other contacts link):
到现在为止,我已经成功使用People API如下图。首先,我向 Google 登录选项提供所需的范围:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestServerAuthCode(getString(R.string.default_web_client_id))
.requestEmail()
.requestProfile()
.requestScopes(new Scope(PeopleServiceScopes.CONTACTS_READONLY))
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
然后我使用我的网络客户端 ID 和密码来获取用户的联系人:
public void getUserContacts () throws IOException {
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
// Go to the Google API Console, open your application's
// credentials page, and copy the client ID and client secret.
// Then paste them into the following code.
String clientId = getString(R.string.webClientIDAutoCreated);
String clientSecret = getString(R.string.webClientIDSecretAutoCreated);
// Or your redirect URL for web based applications.
String redirectUrl = "urn:ietf:wg:oauth:2.0:oob";
String scope = "https://www.googleapis.com/auth/contacts.readonly";
String serverAuthCode = userSettings.getString(USER_PREFS_SERVER_AUTH_CODE,"");
// Step 1: Authorize -->
String authorizationUrl = new GoogleBrowserClientRequestUrl(clientId, redirectUrl, Arrays.asList(scope)).build();
// Point or redirect your user to the authorizationUrl.
System.out.println("Go to the following link in your browser:");
System.out.println(authorizationUrl);
// Read the authorization code from the standard input stream.
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("What is the authorization code?");
String code = in.readLine();
// End of Step 1 <--
// Step 2: Exchange -->
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(httpTransport, jsonFactory, clientId, clientSecret, serverAuthCode, redirectUrl).execute();
// End of Step 2 <--
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setClientSecrets(clientId, clientSecret)
.build()
.setFromTokenResponse(tokenResponse);
PeopleService peopleService = new PeopleService.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(getString(R.string.app_name))
.build();
ListConnectionsResponse response = peopleService.people().connections()
.list("people/me")
.setPersonFields("names,emailAddresses")
.execute();
// Print display name of connections if available.
List<Person> connections = response.getConnections();
if (connections != null && connections.size() > 0) {
for (Person person : connections) {
List<Name> names = person.getNames();
if (names != null && names.size() > 0) {
myLog(TAG,DEBUG_OK,"Name: " + person.getNames().get(0).getDisplayName());
List<EmailAddress> emailAddresses = person.getEmailAddresses();
if (emailAddresses != null && emailAddresses.size() > 0) {
for (EmailAddress email: emailAddresses)
myLog(TAG,DEBUG_OK,"email: " + email.getValue());
}
}
else {
myLog(TAG,DEBUG_OK,"No names available for connection.");
}
}
}
else {
System.out.println("No connections found.");
}
}
我希望这会获得所有可用的联系人,但它 returns 只是一小部分。所以我的问题是我是否需要传递/使用任何其他范围来读取所有联系人,包括 "other contacts" 列表。
人民 API 似乎不支持 . You should use the Contacts API 中所述的 "Other Contacts" 联系人来获取您想要的数据。
People API 现在允许按照此处所述获取其他联系人
https://developers.google.com/people/v1/other-contacts
ListOtherContactsResponse response = peopleService.otherContacts().list()
.setReadMask("metadata,names,emailAddresses")
.execute();
List<Person> otherContacts = response.getOtherContacts();
如果我理解正确,为了从我的 Android 应用中获取用户 Google 联系人,我应该使用 People API instead of the Contacts API. In my case, I want to get all user's contacts including the "other contacts", as shown in the figure below (one can see his/her other contacts by clicking on the other contacts link):
到现在为止,我已经成功使用People API如下图。首先,我向 Google 登录选项提供所需的范围:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestServerAuthCode(getString(R.string.default_web_client_id))
.requestEmail()
.requestProfile()
.requestScopes(new Scope(PeopleServiceScopes.CONTACTS_READONLY))
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
然后我使用我的网络客户端 ID 和密码来获取用户的联系人:
public void getUserContacts () throws IOException {
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
// Go to the Google API Console, open your application's
// credentials page, and copy the client ID and client secret.
// Then paste them into the following code.
String clientId = getString(R.string.webClientIDAutoCreated);
String clientSecret = getString(R.string.webClientIDSecretAutoCreated);
// Or your redirect URL for web based applications.
String redirectUrl = "urn:ietf:wg:oauth:2.0:oob";
String scope = "https://www.googleapis.com/auth/contacts.readonly";
String serverAuthCode = userSettings.getString(USER_PREFS_SERVER_AUTH_CODE,"");
// Step 1: Authorize -->
String authorizationUrl = new GoogleBrowserClientRequestUrl(clientId, redirectUrl, Arrays.asList(scope)).build();
// Point or redirect your user to the authorizationUrl.
System.out.println("Go to the following link in your browser:");
System.out.println(authorizationUrl);
// Read the authorization code from the standard input stream.
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("What is the authorization code?");
String code = in.readLine();
// End of Step 1 <--
// Step 2: Exchange -->
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(httpTransport, jsonFactory, clientId, clientSecret, serverAuthCode, redirectUrl).execute();
// End of Step 2 <--
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setClientSecrets(clientId, clientSecret)
.build()
.setFromTokenResponse(tokenResponse);
PeopleService peopleService = new PeopleService.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(getString(R.string.app_name))
.build();
ListConnectionsResponse response = peopleService.people().connections()
.list("people/me")
.setPersonFields("names,emailAddresses")
.execute();
// Print display name of connections if available.
List<Person> connections = response.getConnections();
if (connections != null && connections.size() > 0) {
for (Person person : connections) {
List<Name> names = person.getNames();
if (names != null && names.size() > 0) {
myLog(TAG,DEBUG_OK,"Name: " + person.getNames().get(0).getDisplayName());
List<EmailAddress> emailAddresses = person.getEmailAddresses();
if (emailAddresses != null && emailAddresses.size() > 0) {
for (EmailAddress email: emailAddresses)
myLog(TAG,DEBUG_OK,"email: " + email.getValue());
}
}
else {
myLog(TAG,DEBUG_OK,"No names available for connection.");
}
}
}
else {
System.out.println("No connections found.");
}
}
我希望这会获得所有可用的联系人,但它 returns 只是一小部分。所以我的问题是我是否需要传递/使用任何其他范围来读取所有联系人,包括 "other contacts" 列表。
人民 API 似乎不支持
People API 现在允许按照此处所述获取其他联系人
https://developers.google.com/people/v1/other-contacts
ListOtherContactsResponse response = peopleService.otherContacts().list()
.setReadMask("metadata,names,emailAddresses")
.execute();
List<Person> otherContacts = response.getOtherContacts();