Get User's Birthdate & Gender using Google Sig

2019-01-27 13:34发布

问题:

I've integrated Google Sign-In in my application. I can get user's Email and DisplayName. Now, I want to get user's Birthdate and Gender.

I've added all required requests & Scopes into GoogleApiClient which all are granted by API. here's code.

    // [START configure_signin]
    // Configure sign-in to request the user's ID, email address, and basic
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestProfile() <- This
            .requestScopes(
                    new Scope(Scopes.PLUS_ME), new Scope(Scopes.PROFILE) <- This
            )
            .build();
    // [END configure_signin]

    // [START build_client]
    // Build a GoogleApiClient with access to the Google Sign-In API and the
    // options specified by gso.
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                    // An unresolvable error has occurred and Google APIs (including Sign-In) will not
                    // be available.
                    Log.d(TAG, "onConnectionFailed:" + connectionResult);
                }
            } /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .addScope(new Scope(Scopes.PLUS_ME)) <- This
            .addScope(new Scope(Scopes.PROFILE)) <- This
            .build();
    // [END build_client]

Here's the granted Scopes in GoogleSignInAccount

private void setupUserData(GoogleSignInAccount acct) {
    if (acct != null) {
        mPrefs.setName(acct.getDisplayName());
        mPrefs.setEmail(acct.getEmail());
        if (acct.getPhotoUrl() != null) {
            mPrefs.setPicURL(acct.getPhotoUrl().toString());
        }
        Set<Scope> scopes = acct.getGrantedScopes(); <- This
        for (Scope scope : scopes) {
            Log.d(TAG, "setupUserData: " + scope.toString()); <- This
        }
    }
}

Here's the log of granted scopes

D/SplashActivity: setupUserData: GrantedScopes size 6
D/SplashActivity: setupUserData: https://www.googleapis.com/auth/plus.me
D/SplashActivity: setupUserData: https://www.googleapis.com/auth/userinfo.email
D/SplashActivity: setupUserData: https://www.googleapis.com/auth/userinfo.profile
D/SplashActivity: setupUserData: email
D/SplashActivity: setupUserData: profile
D/SplashActivity: setupUserData: openid

Here's my Google Mobile Service's dependency

compile 'com.google.android.gms:play-services-auth:10.2.0'
compile 'com.google.android.gms:play-services-plus:10.2.0'

Now, I don't know how to get access to user's profile information.

回答1:

As mentioned in Getting people and profile information, to get additional profile information and a user's contacts, use the People API. You must get consent from the user to access this information by requesting additional scopes when the user signs in.

You can call people.get, passing in a resource name, to get private contact and public profile data for each person. If your request is successful, the response contains an instance of a Person including birthday and gender.

You may want to visit the links I've provided for more information.



回答2:

Here is the complete working example, hope it help for future reader. What the app do is sign in(Sign In API included name and email) first, then request birthday & gender(People API) authentication, and save it to SharedPreferences for reuse on next launch. Finally it will print basic info and advanced (gender & birthday) info.

public class MainActivity extends AppCompatActivity {

    static final private int RC_SIGN_IN = 1;
    static final private String TAG = "hole";
    private WeakReference<MainActivity> weakAct = new WeakReference<>(this);
    private GoogleSignInClient mGoogleSignInClient;
    private GoogleSignInAccount account;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Scope myScope = new Scope("https://www.googleapis.com/auth/user.birthday.read");
        Scope myScope2 = new Scope(Scopes.PLUS_ME);
        Scope myScope3 = new Scope(Scopes.PROFILE); //get name and id
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestScopes(myScope, myScope2)
                .requestEmail()
                .requestProfile()
                .build();

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        account = GoogleSignIn.getLastSignedInAccount(this);
        if (account == null) {
            reqPerm();
        } else {
            SharedPreferences sharedPref = getSharedPreferences(account.getId(), MODE_PRIVATE);
            if (sharedPref.contains("gender")) {
                printBasic();
                printAdvanced();
            } else {
                new GetProfileDetails(account, weakAct, TAG).execute();
            }
        }
    }

    private void reqPerm() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    private void printBasic() {
        account = GoogleSignIn.getLastSignedInAccount(this);
        if (account != null) {
            Log.d(TAG, "latest sign in: "
                    + "\n\tPhoto url:" + account.getPhotoUrl()
                    + "\n\tEmail:" + account.getEmail()
                    + "\n\tDisplay name:" + account.getDisplayName()
                    + "\n\tFamily(last) name:" + account.getFamilyName()
                    + "\n\tGiven(first) name:" + account.getGivenName()
                    + "\n\tId:" + account.getId()
                    + "\n\tIdToken:" + account.getIdToken()
            );
        } else {
            Log.w(TAG, "basic info is null");
        }
    }

    private void saveAdvanced(Person meProfile) {
        account = GoogleSignIn.getLastSignedInAccount(this);
        if (account != null) {
            SharedPreferences sharedPref = getSharedPreferences(account.getId(), MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPref.edit();

            if (n.size() > 0) {
                try {
                    Log.d("hole", "g name: " + n);
                    editor.putString("givenName", n.get(0).getGivenName());
                    editor.putString("familyName", n.get(0).getFamilyName());
                    editor.putString("id", n.get(0).getMetadata().getSource().getId());
                 } catch (Exception e) {
                    e.printStackTrace();
                    //this one should act as fallback priority since it got problem to get name without wait for ~1 minute
                    // ... when create new account will get empty name
                    editor.putString("id", account.getId());
                    editor.putString("givenName", account.getGivenName());
                    editor.putString("familyName", account.getFamilyName());
            }
        }
            List<Gender> genders = meProfile.getGenders();
            if (genders != null && genders.size() > 0) {
                String gender = genders.get(0).getValue();
                Log.d(TAG, "onPostExecute gender: " + gender);
                editor.putString("gender", gender);
            } else {
                Log.d(TAG, "onPostExecute no gender if set to private ");
                editor.putString("gender", ""); //save as main key to know pref saved
            }
            List<Birthday> birthdays = meProfile.getBirthdays();
            if (birthdays != null && birthdays.size() > 0) {
                for (Birthday b : birthdays) { //birthday still able to get even private, unlike gender
                    Date bdate = b.getDate();
                    if (bdate != null) {
                        String bday, bmonth, byear;
                        if (bdate.getDay() != null) bday = bdate.getDay().toString();
                        else bday = "";
                        if (bdate.getMonth() != null) bmonth = bdate.getMonth().toString();
                        else bmonth = "";
                        if (bdate.getYear() != null) byear = bdate.getYear().toString();
                        else byear = "";
                        editor.putString("bday", bday);
                        editor.putString("bmonth", bmonth);
                        editor.putString("byear", byear);
                    }
                }
            } else {
                Log.w(TAG, "saveAdvanced no birthday");
            }
            editor.commit();  //next instruction is print from pref, so don't use apply()
        } else {
            Log.w(TAG, "saveAdvanced no acc");
        }
    }

    private void printAdvanced() {
        account = GoogleSignIn.getLastSignedInAccount(this);
        if (account != null) {
            SharedPreferences sharedPref = getSharedPreferences(account.getId(), MODE_PRIVATE);
            if (sharedPref.contains("gender")) { //this checking works since null still saved
                String gender = sharedPref.getString("gender", "");
                Log.d(TAG, "gender: " + gender);
                if (sharedPref.contains("bday")) { //this checking works since null still saved
                    String bday = sharedPref.getString("bday", "");
                    String bmonth = sharedPref.getString("bmonth", "");
                    String byear = sharedPref.getString("byear", "");
                    Log.d(TAG, bday + "/" + bmonth + "/" + byear);
                } else {
                    Log.w(TAG, "failed ot get birthday from pref");
                }
                String givenName = sharedPref.getString("givenName", "");
                String familyName = sharedPref.getString("familyName", "");
                String id = sharedPref.getString("id", "");
            } else {
                Log.w(TAG, "failed ot get data from pref -2");
            }

        } else {
            Log.w(TAG, "failed ot get data from pref -1");
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            if (resultCode == Activity.RESULT_OK) {
                Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
                handleSignInResult(task);
            } else {
                Log.w(TAG, "failed, user denied OR no network OR jks SHA1 not configure yet at play console android project");
            }
        }
    }

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            // Signed in successfully, show authenticated UI.
            new GetProfileDetails(account, weakAct, TAG).execute();
        } catch (ApiException e) { //cancel choose acc will come here with status code 12501 if not check RESULT_OK
            // , more status code at:
            //https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInStatusCodes
            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
        }
    }

    static class GetProfileDetails extends AsyncTask<Void, Void, Person> {

        private PeopleService ps;
        private int authError = -1;
        private WeakReference<MainActivity> weakAct;
        private String TAG;

        GetProfileDetails(GoogleSignInAccount account, WeakReference<MainActivity> weakAct, String TAG) {
            this.TAG = TAG;
            this.weakAct = weakAct;
            GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
                    this.weakAct.get(), Collections.singleton(Scopes.PROFILE));
            credential.setSelectedAccount(
                    new Account(account.getEmail(), "com.google"));
            HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();
            JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
            ps = new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                    .setApplicationName("Google Sign In Quickstart")
                    .build();
        }

        @Override
        protected Person doInBackground(Void... params) {
            Person meProfile = null;
            try {
                meProfile = ps
                        .people()
                        .get("people/me")
                        .setPersonFields("names,genders,birthdays")
                        .execute();
            } catch (UserRecoverableAuthIOException e) {
                e.printStackTrace();
                authError = 0;
            } catch (GoogleJsonResponseException e) {
                e.printStackTrace();
                authError = 1;
            } catch (IOException e) {
                e.printStackTrace();
                authError = 2;
            }
            return meProfile;
        }

        @Override
        protected void onPostExecute(Person meProfile) {
            MainActivity mainAct = weakAct.get();
            if (mainAct != null) {
                mainAct.printBasic();
                if (authError == 0) { //app has been revoke, re-authenticated required.
                    mainAct.reqPerm();
                } else if (authError == 1) {
                    Log.w(TAG, "People API might not enable at" +
                            " https://console.developers.google.com/apis/library/people.googleapis.com/?project=<project name>");
                } else if (authError == 2) {
                    Log.w(TAG, "API io error");
                } else {
                    if (meProfile != null) {
                        mainAct.saveAdvanced(meProfile);
                        mainAct.printAdvanced();
                    }
                }
            }
        }
    }
}

Reminder:

  1. Add <uses-permission android:name="android.permission.INTERNET" /> in AndroidManifest.xml.
  2. Add implementation 'com.google.android.gms:play-services-auth:12.0.1', implementation 'com.google.apis:google-api-services-people:v1-rev255-1.23.0', and implementation 'com.google.api-client:google-api-client-android:1.23.0' in dependencies {} of build.gradle.
  3. In my case I downgrade compileSdkVersion, targetSdkVersion, and appcompat-v7 from 27 to 26 since I got warning after #2 dependencies added.
  4. Add signingConfigs { debug { storeFile file('<path to jks file>') keyAlias '<your key alias>' keyPassword '<your key password>' storePassword '<your store password>' } } in build.gradle, which jks file generated from Build -> Generated Signed APK... -> Create new...
  5. keytool -exportcert -keystore <path to jks file> -list -v to get SHA1 hex key, then visits play console, fill in project name, app package name, SHA1 hex key.
  6. Enable People API at https://console.developers.google.com/apis/library/people.googleapis.com/?project=[your project id]", which project id can get from play console. Note that it's not project name.
  7. I noticed no such Scopes.BIRTHDAY in library, so I have to hard-coded the birthday endpoint URL"https://www.googleapis.com/auth/user.birthday.read", which the link can get from https://developers.google.com/people/v1/how-tos/authorizing#profile-scopes OR "Show Scopes" in "Try it API" panel at https://developers.google.com/people/api/rest/v1/people/get
  8. Birthday is a list, and it may loop 2 date items, one item lack of year in my case. My code always replace to save those 2 items. There may be better way to handle it.
  9. Gender only able to return if it's not private. Birthday no such restriction.
  10. Since Android device need ~1 minute delay to get new created account name, so you might need to use PROFILE scope instead of simple account.getGivenName() and account.getFamilyName().


回答3:

Below is my answer hope it helps to you.

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.e(TAG, "--------------------------------");
        Log.e(TAG, "Display Name: " + person.getDisplayName());
        Log.e(TAG, "Gender: " + person.getGender());
        Log.e(TAG, "AboutMe: " + person.getAboutMe());
        Log.e(TAG, "Birthday: " + person.getBirthday());
        Log.e(TAG, "Current Location: " + person.getCurrentLocation());
        Log.e(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 belo GitHub sample project. Hope this helps and solved your problem.

https://github.com/ngocchung/GoogleSignInDemo

If you want latest integration please follow below link which have a nice documentation as well as brief about code and it's all parameter.

https://developers.google.com/identity/sign-in/android/start-integrating

GoogleSignInAccount acct = GoogleSignIn.getLastSignedInAccount(getActivity());
if (acct != null) {
  String personName = acct.getDisplayName();
  String personGivenName = acct.getGivenName();
  String personFamilyName = acct.getFamilyName();
  String personEmail = acct.getEmail();
  String personId = acct.getId();
  Uri personPhoto = acct.getPhotoUrl();
}


回答4:

Gradle

implementation "com.google.android.gms:play-services-auth:${google_play_service_version}"
implementation 'com.google.apis:google-api-services-people:v1-rev354-1.25.0'
implementation ('com.google.api-client:google-api-client-android:1.23.0') {
    exclude group: 'org.apache.httpcomponents'
}

Authentication

private void setupGoogleLogin() {
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestScopes(new Scope(PeopleApi.CONTACT_SCOPE), new Scope(PeopleApi.BIRTHDAY_SCOPE))
                .requestEmail()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, mOnConnectionFailedListener)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();
    }

PeopleApi

public class PeopleApi {
    public static final String CONTACT_SCOPE = "https://www.googleapis.com/auth/contacts.readonly";
    public static final String BIRTHDAY_SCOPE = "https://www.googleapis.com/auth/user.birthday.read";
    private static PeopleService mInstance;

    private static PeopleService getService() {
        if (mInstance == null) mInstance = initializeService();
        return mInstance;
    }

    private static PeopleService initializeService() {
        Context context = BHApp.getContext();
        GoogleAccountCredential credential =
                GoogleAccountCredential.usingOAuth2(context, Arrays.asList(CONTACT_SCOPE, BIRTHDAY_SCOPE));
        credential.setSelectedAccount(GoogleSignIn.getLastSignedInAccount(context).getAccount());

        return new PeopleService.Builder(AndroidHttp.newCompatibleTransport(), JacksonFactory.getDefaultInstance(), credential)
                .setApplicationName(context.getString(R.string.app_name)).build();
    }

    public static Person getProfile() {
        try {
            return getService().people().get("people/me")
                    .setPersonFields("genders,birthdays,addresses")
                    .execute();
        } catch (Exception e) {
            Utils.handleException(e);
            return null;
        }
    }

    public static String getBirthday(Person person) {
        try {
            List<Birthday> birthdayList = person.getBirthdays();
            if (birthdayList == null) return Utils.EMPTY_STRING;
            Date date = null;
            for (Birthday birthday : birthdayList) {
                date = birthday.getDate();
                if (date != null && date.size() >= 3) break;
                else date = null;
            }
            if (date == null) return Utils.EMPTY_STRING;
            Calendar calendar = Calendar.getInstance();
            calendar.set(date.getYear(), date.getMonth() - 1, date.getDay());
            return Utils.convertDateToString(calendar);
        } catch (Exception e) {
            Utils.handleException(e);
            return Utils.EMPTY_STRING;
        }
    }

    private static final String CITY_SUFFIX = " city";
    public static android.location.Address getLocation(Person person) {
        try {
            List<Address> addressList = person.getAddresses();
            if (addressList == null) return null;
            String city = null;
            for (Address add : addressList) {
                city = add.getCity();
                if (!TextUtils.isEmpty(city)) break;
            }
            if (TextUtils.isEmpty(city)) return null;

            Geocoder geocoder = new Geocoder(BHApp.getContext());

            List<android.location.Address> addresses =  geocoder.getFromLocationName(city + CITY_SUFFIX, 1);
            if (addresses == null || addresses.isEmpty()) return null;
            return addresses.get(0);
        } catch (Exception e) {
            Utils.handleException(e);
            return null;
        }
    }

    public static String getGender(Person person) {
        List<Gender> genders = person.getGenders();
        if (genders == null || genders.isEmpty()) return null;
        Gender gender = genders.get(0);
        return String.valueOf(Enum.Gender.getEnumByValue(gender.getValue()).getId());
    }
}

I hope it helps :)



回答5:

add this in your build.gradle dependencies

implementation 'com.google.android.gms:play-services-auth:11.8.0'

try this

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.plus.People;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.model.people.Person;

public class MainActivity extends AppCompatActivity implements  GoogleApiClient.OnConnectionFailedListener{

private SignInButton signInButton;
private GoogleSignInOptions gso;
private GoogleApiClient mGoogleApiClient;
private int SIGN_IN = 30;

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();
    signInButton = (SignInButton) findViewById(R.id.sign_in_button);
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .addApi(Plus.API)
            .build();

signInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, SIGN_IN);
        }
    });
}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //If signin
    if (requestCode == SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        //Calling a new function to handle signin
        handleSignInResult(result);
    }
}

private void handleSignInResult(GoogleSignInResult result) {

    if (result.isSuccess()) {

        final GoogleSignInAccount acct = result.getSignInAccount();


        String name = acct.getDisplayName();
        final String mail = acct.getEmail();
        // String photourl = acct.getPhotoUrl().toString();

        final String givenname="",familyname="",displayname="",birthday="";

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

                Log.d("GivenName ", person.getName().getGivenName());
                Log.d("FamilyName ",person.getName().getFamilyName());
                Log.d("DisplayName ",person.getDisplayName());
                Log.d("gender ", String.valueOf(person.getGender())); //0 = male 1 = female
                String gender="";
                if(person.getGender() == 0){
                    gender = "Male";
                }else {
                    gender = "Female";
                }
                    Log.d("Gender ",gender);
                if(person.hasBirthday()){
                    Log.d("Birthday ",person.getBirthday());
                }


            }
        });
    } else {

        Toast.makeText(this, "Login Failed", Toast.LENGTH_LONG).show();
    }
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}
}


回答6:

Using People api's you can retrieve birthdate and gender details.

Use dependency 'com.google.apis:google-api-services-people:v1-rev4-1.22.0' in gradle to include people's api.

public void fetchProfileDetails() {
    GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(context, Collections.singleton(Scopes.PROFILE));
    credential.setSelectedAccount(
            new Account(gsr.getSignInAccount().getEmail(), "com.google"));
    /** Global instance of the HTTP transport. */
    HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();
    /** Global instance of the JSON factory. */
    JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    People service = new People.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName("AppName")
            .build();
    try {
        meProfile = service.people().get("people/me").execute();
        List<Gender> genders = meProfile.getGenders();
        if (genders != null && genders.size() > 0) {
            String gender = genders.get(0).getValue();
        }
        List<Birthday> birthdays = meProfile.getBirthdays();
        if (birthdays != null && birthdays.size() > 0) {
            String birthday = birthdays.get(0).getText();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}