How to get profile like gender from google signin in Android?

google sign in get gender
android get google account programmatically
android get user profile
get phone number from google sign in android
get name from google login android
android login with facebook and google example
android google sign-in
android get user name programmatically

I want to integrate google sign in to my app, when user first sign in I will create an account bind to this, so I need some profiles like gender, locale, etc. and I tried as the google-sign-in doc and quick-start sample shows:

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();

when click to sign in I will call:

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

sign in successful, I can get a data structure GoogleSignInResult in onActivityResult, from GoogleSignInResult I can get a GoogleSignInAccount, which only contains DisplayName, email and id. but when in https://developers.google.com/apis-explorer/#p/, I can get profiles like gender, locale. Is there anything I missed?

and I tried google plus api, it seems that I can get what I want. but don't know how to use, the doc says create client like this:

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();

but when I use this, click signin button will cause app crash.

Update: problems when update to new version of google sign in Missing api_key/current key with Google Services 3.0.0

UPDATE:

Since Plus.PeopleApi has been deprecated in Google Play services 9.4 as Google's declaration notes, please refer to the following solutions using Google People API instead:

Get person details in new google sign in Play Services 8.3 (Isabella Chen's answer);

Cannot get private birthday from Google Plus account although explicit request

END OF UPDATE


First of all, make sure you have created Google+ profile for your Google account. Then you can refer to the following code:

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

and

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

Then

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

Inside build.gradle file

// 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'

You can take a look at My GitHub sample project. Hope this helps!

Getting Profile Information, Before you begin; Retrieve profile information for a signed-in user If you configured Google Sign-In with the requestEmail method, you can also get Except as otherwise noted, the content of this page is licensed under the  Note: A Google account's email address can change, so don't use it to identify a user. Instead, use the account's ID, which you can get on the client with GoogleSignInAccount.getId, and on the backend from the sub claim of the ID token. For additional profile data that might be available, see GoogleSignInAccount. Note that any of the profile

The Plus people stuff is deprecated, don't use it anymore. The way to do this is with the Google People API Enable this API in your project. If you don't, the exception thrown in Studio includes a link directly to your project to enable it (nice).

Include the following dependencies in your app's 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'

Do an authorized GoogleSignIn like normal. It doesn't need any Scopes or Api's other than the basic account ones e.g.

GoogleSignInOptions.DEFAULT_SIGN_IN

.addApi(Auth.GOOGLE_SIGN_IN_API, gso)

and requests for email and profile is all you need.

Now, once you have a successful signin result, you can get the account, including the email (could maybe do this with the id too).

final GoogleSignInAccount acct = googleSignInResult.getSignInAccount();

Now the new part: Create and execute an AsyncTask to call the Google People API after you get the acct email.

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

Here is the 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;
    }
}

Here is the stuff that is available from the Person

If you paste the code into your project, make sure the imports get resolved correctly. There are overlapping Class Names with some of the older API's.

How to get profile like gender from google signin in Android , I want to integrate google sign in to my app when user first sign in I will create an account bind to this so I need some profiles like How to get profile like gender from google signin in Android? (4) After login, do: Plus. PeopleApi. load (mGoogleApiClient, acct. getId ()). setResultCallback (new ResultCallback < People. LoadPeopleResult >() {@Override public void onResult (@NonNull People.

After login, do:

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

Is there an SDK for Android that detects user's age and gender , I want to integrate google sign in to my app, when user first sign in I will create an account bind to this, so I need some profiles like gender, locale, etc. and I tried  I'm trying to get a user's profile using the new Google Sign In API introduced in play services 8.3. Other than Display Name, Email and Id, I also need user's gender. Plus.PeopleApi.getCurrentPerson() is deprecated as per play services 8.3 and also returns null for me even though. mGoogleApiClient.hasConnectedApi(Plus.API) returns true.

Create the google signin options like below. This works perfect for me

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

Set User Properties - Firebase, gender information from there. Here are few links to make things easier for you: How can i get profile like gender from google signin in android? How to get Fa. Here comes the bonus part of this Google Sign-In example. Read this to find how Google Sign-In can help you with your backend implementation. You can also use Google Sign-In to identify the user on your backend server. This can be done with the help of idToken returned from Google.

I spent some time to find a solution so let me share current way to achieve it.

You need to extend Google Sign in options like this:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.google_client_id)) //like: '9241xyz.apps.googleusercontent.com'
            .requestEmail()
            .requestProfile()
            .requestServerAuthCode(getString(R.string.google_client_id))
            .build();

Then in response you receive GoogleSignInResult object with GoogleSignInAccount. You extract both token id and auth code from it.

private void handleGoogleSignInResult(GoogleSignInResult result) {
    if (result.isSuccess()) {
        GoogleSignInAccount acct = result.getSignInAccount();
        String authCode = acct.getServerAuthCode();
        String idToken = acct.getIdToken();
    }
}

What you need to do next is to get access_token with POST request:

POST https://www.googleapis.com/oauth2/v4/token
Body (x-www-form-urlencoded):
grant_type authorization_code
client_id 9241xyz.apps.googleusercontent.com
client_secret MNw...fMO
redirect_uri ""
code auth_code_from_google_account
id_token id_token_from_google_account

Request can be done in Android app, but I recommend to do it on server side as it's not safe to keep client_secret in Android app. But it's up to you. Response for such request looks like this:

{
"access_token": "ya29.GluIBuHTXZ...kTglmCceBG",
"expires_in": 3552,
"scope": "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/plus.me",
"token_type": "Bearer",
"id_token": "eyJhbGciOiJSUzI1NiIsImt....V6EAlQd3-Y9CQ"
}

Then you can query user profile endpoint for user details:

GET https://www.googleapis.com/oauth2/v3/userinfo
Headers:
Authorization : Bearer ya29.GluIBuHTXZ...kTglmCceBG

Response looks like this:

{
"sub": "107...72",
"name": "Johny Big",
"given_name": "Johny",
"family_name": "Big",
"profile": "https://plus.google.com/107417...990272",
"picture": "https://lh3.googleusercontent.com/-....IxRQ/mo/photo.jpg",
"email": "johny.biggy.test@gmail.com",
"email_verified": true,
"gender" : "male",
"locale": "en"
}

However, if user doesn't have public access to info about him, gender field might be missing here. Probably you need to ask for additional scope in Google Sign in request, but I didn't check. (sharing options are under Google account page: https://myaccount.google.com/personal-info)

How to get user country name by google signin API?, Get Started · Manage Users · Password Authentication · Google Sign-in · Play Games You can't use a small set of user property names reserved by Google: Age; Gender; Interest Make sure that you've set up your project and can access Analytics as Android · Chrome · Firebase · Google Cloud Platform · All products​. Then, when the sign-in button is clicked, the application starts the sign-in intent, which prompts the user to sign in with a Google account. // Configure sign-in to request the user's ID, email address, and basic // profile.

Turn sync on and off in Chrome - Android, PROFILE); //get name and id GoogleSignInOptions gso = new GoogleSignInOptions. How to get profile like gender from google signin in Android? I want to  The next steps then describe how to integrate Google Sign-In into your app. Prerequisites. Google Sign-In for Android has the following requirements: A compatible Android device that runs Android 4.1 or newer and includes the Google Play Store or an emulator with an AVD that runs the Google APIs platform based on Android 4.2.2 or newer and has

react-native-community/google-signin, Now, I want to get user's Birthdate and Gender. PROFILE); //get name and id GoogleSignInOptions gso = new GoogleSignInOptions. I am using Google API for .Net, but no doubt you can find the same way to obtain this information using other version of API. As user872858 mentioned, scope userinfo.profile has been deprecated (google article) .

You'll sign in automatically to Gmail, YouTube, Search, and other Google services. If you change devices (like if you lose your phone or get a new laptop​), you'll Chrome may combine any declared age and gender information from your  Getting profile information After you have signed in a user with Google using the default scopes, you can access the user's Google ID, name, profile URL, and email address. Important: Do not use the Google IDs returned by getId() or the user's profile information to communicate the currently signed in user to your backend server.

Comments
  • did you find anything or not ??
  • @amanverma I read your new question. IMO, you should read the comments between the OP and me below my answer at this question.
  • nah actually i think as google sign-in is working fine so there is nothing wrong in my keystore i think problem is somewhere else ??
  • @amanverma the OP has had the same issue as yours. Pls read his entire question again.
  • what do u mean by OP ??
  • mGoogleApiClient.isConnected() returns true but Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) returns null ,I use the keystore at C:\Users\xxx\.android\debug.keystore to generate sha1,and your project lack google-service.json.
  • If you use my sample project, of course you must update with your application Id and your google-service.json file
  • yes ,in developer's console i register the sha1 of %USERPROFILE%\.android\debug.keystore,but when build AS uses %ANDROID_SDK_HOME%\.android\debug.keystore,the dismatch caused getPerson return null .
  • @suku see my project at Github, pay attention at "if (mGoogleApiClient.hasConnectedApi..." and "if (person != null)"
  • thanks!! I missed the .requestScopes(new Scope(Scopes.PLUS_LOGIN)) thats why I always got 0 for gender.
  • This method is deprecated
  • Sign Option for what ? You should define api client