Подтвердить что ты не робот

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

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

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, кажется, что я могу получить то, что хочу. но не знаю, как использовать, документ говорит создать клиент следующим образом:

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

>
4b9b3361

Ответ 1

ОБНОВЛЕНИЕ:

Так как 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. Надеюсь, это поможет!

Ответ 2

Люди с плюсом люди устарели, больше не используйте. Способ сделать это с помощью 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;
    }
}

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

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

Ответ 3

Создайте параметры входа в 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();

Ответ 4

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

 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() + ""));
        }
    });