Как получить такой профиль, как пол из google signin в Android?

Я хочу интегрировать вход google в мое приложение, когда пользователь первым будет входить в систему. Я создам привязку к этой учетной записи, поэтому мне нужны некоторые профили, такие как пол, локаль и т. Д., И я попробовал как документ для входа в google и быстро -start показывает:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); 

При нажатии, чтобы войти в систему Я позвоню:

  Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); 

Я могу получить структуру данных GoogleSignInResult в onActivityResult, из GoogleSignInResult я могу получить аккаунт GoogleSignInAccount, который содержит только DisplayName, email и id. Но когда в https://developers.google.com/apis-explorer/#p/ , я могу получить профили, такие как пол, локаль. Я что-то пропустил?

И я попробовал google plus api, кажется, что я могу получить то, что хочу. Но не знаю, как использовать, doc говорит создать клиент следующим образом:

 mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Plus.API) .addScope(new Scope(Scopes.PLUS_LOGIN)) .addScope(new Scope(Scopes.PLUS_ME)) .build(); 

Но когда я использую это, нажмите кнопку «Signin», что приведет к сбою приложения.

Обновление: проблемы при обновлении до новой версии значка google Отсутствует api_key / текущий ключ с Google Apps 3.0.0

Solutions Collecting From Web of "Как получить такой профиль, как пол из google signin в Android?"

ОБНОВИТЬ:

Поскольку Plus.PeopleApi устарела в сервисах Google Play 9.4 как заметки о декларации Google , обратитесь к следующим решениям, используя API Google People :

Получить информацию о лицах в новом значке google в Службе Служб 8.3 (ответ Изабеллы Чена);

Не удается получить частный день рождения из учетной записи Google Plus, хотя явный запрос

КОНЕЦ ОБНОВЛЕНИЯ


Прежде всего, убедитесь, что вы создали профиль Google+ для своей учетной записи Google. Затем вы можете обратиться к следующему коду:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestEmail() .build(); 

а также

 mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(Plus.API) .build(); 

затем

  @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); // G+ Person person = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); Log.i(TAG, "--------------------------------"); Log.i(TAG, "Display Name: " + person.getDisplayName()); Log.i(TAG, "Gender: " + person.getGender()); Log.i(TAG, "AboutMe: " + person.getAboutMe()); Log.i(TAG, "Birthday: " + person.getBirthday()); Log.i(TAG, "Current Location: " + person.getCurrentLocation()); Log.i(TAG, "Language: " + person.getLanguage()); } } 

Внутри файла build.gradle

 // Dependency for Google Sign-In compile 'com.google.android.gms:play-services-auth:8.3.0' compile 'com.google.android.gms:play-services-plus:8.3.0' 

Вы можете взглянуть на образец проекта My GitHub . Надеюсь это поможет!

Люди с плюсом люди устарели, больше не используйте. Способ сделать это с помощью API Google People. Включите этот API в свой проект. Если вы этого не сделаете, исключение, заброшенное в Studio, включает ссылку непосредственно на ваш проект, чтобы включить ее (хорошо).

Включите следующие зависимости в файле build.gradle вашего приложения:

 compile 'com.google.api-client:google-api-client:1.22.0' compile 'com.google.api-client:google-api-client-android:1.22.0' compile 'com.google.apis:google-api-services-people:v1-rev4-1.22.0' 

Сделайте авторизованный GoogleSignIn как обычно. Он не нуждается ни в каких Scope или Api, кроме основных учетных записей, например

 GoogleSignInOptions.DEFAULT_SIGN_IN .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 

И запросы на электронную почту и профиль – это все, что вам нужно.

Теперь, как только у вас будет успешный результат, вы можете получить учетную запись, включая электронную почту (возможно, это может сделать и с идентификатором).

 final GoogleSignInAccount acct = googleSignInResult.getSignInAccount(); 

Теперь новая часть: создайте и выполните AsyncTask для вызова API Google People после того, как вы получите адрес электронной почты acct.

 // get Cover Photo Asynchronously new GetCoverPhotoAsyncTask().execute(Prefs.getPersonEmail()); 

Вот AsyncTask:

 // Retrieve and save the url to the users Cover photo if they have one private class GetCoverPhotoAsyncTask extends AsyncTask<String, Void, Void> { HttpTransport httpTransport = new NetHttpTransport(); JacksonFactory jsonFactory = new JacksonFactory(); // Retrieved from the sigin result of an authorized GoogleSignIn String personEmail; @Override protected Void doInBackground(String... params) { personEmail = params[0]; Person userProfile = null; Collection<String> scopes = new ArrayList<>(Collections.singletonList(Scopes.PROFILE)); GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(SignInActivity.this, scopes); credential.setSelectedAccount(new Account(personEmail, "com.google")); People service = new People.Builder(httpTransport, jsonFactory, credential) .setApplicationName(getString(R.string.app_name)) // your app name .build(); // Get info. on user try { userProfile = service.people().get("people/me").execute(); } catch (IOException e) { Log.e(TAG, e.getMessage(), e); } // Get whatever you want if (userProfile != null) { List<CoverPhoto> covers = userProfile.getCoverPhotos(); if (covers != null && covers.size() > 0) { CoverPhoto cover = covers.get(0); if (cover != null) { // save url to cover photo here, load at will //Prefs.setPersonCoverPhoto(cover.getUrl()); } } } return null; } } 

Вот материал, который доступен от Лица

Если вы вставляете код в свой проект, убедитесь, что импорт правильно разрешен. Есть перекрывающиеся имена классов с некоторыми из старых API.

Создайте параметры входа в Google, как показано ниже. Это отлично работает для меня

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .requestProfile() .requestScopes(new Scope(Scopes.PLUS_ME)) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .build(); 

После входа в систему выполните:

  Plus.PeopleApi.load(mGoogleApiClient, acct.getId()).setResultCallback(new ResultCallback<People.LoadPeopleResult>() { @Override public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) { Person person = loadPeopleResult.getPersonBuffer().get(0); LogUtil.d("googleuser: getGivenName " + (person.getName().getGivenName())); LogUtil.d("googleuser: getFamilyName " + (person.getName().getFamilyName())); LogUtil.d("googleuser: getDisplayName " + (person.getDisplayName())); LogUtil.d("googleuser: getGender " + (person.getGender() + "")); LogUtil.d("googleuser: getBirthday " + (person.getBirthday() + "")); } });