web-dev-qa-db-fra.com

Obtenir la date de naissance et le sexe de l'utilisateur à l'aide de Google Sign-In Android

J'ai intégré Google Sign-In dans mon application. Je peux obtenir l'utilisateur Email et DisplayName. Maintenant, je veux obtenir les Birthdate et Gender de l'utilisateur.

J'ai ajouté tous les requests & Scopes requis dans GoogleApiClient qui sont tous accordés par l'API. voici le 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]

Voici les étendues accordées dans 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
        }
    }
}

Voici le journal de scopes accordé

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

Voici la dépendance de mon service Google Mobile

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

Maintenant, je ne sais pas comment accéder à user's profile information.

17
Kasim Rangwala

Comme indiqué dans Obtention d'informations sur les personnes et le profil , pour obtenir des informations supplémentaires sur le profil et les contacts d'un utilisateur, utilisez l'API People . Vous devez obtenir le consentement de l'utilisateur pour accéder à ces informations en demandant des scopes lorsque l'utilisateur se connecte.

Vous pouvez appeler people.get en transmettant un nom de ressource pour obtenir des données de contact privé et de profil public pour chaque personne. Si votre demande aboutit, la réponse contient une instance de Person incluant anniversaire et genre .

Vous voudrez peut-être consulter les liens que j'ai fournis pour plus d'informations.

11
Teyam

Voici l'exemple complet de travail, espérons que cela aidera pour le futur lecteur. En premier lieu, l’application se connecte (nom et e-mail de l’API de connexion inclus), puis demande une authentification anniversaire et sexe (People API), puis enregistre-la dans SharedPreferences pour la réutilisation lors du prochain lancement. Enfin, les informations de base et les informations avancées (sexe et anniversaire) seront imprimées.

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

Rappel:

  1. Ajoutez <uses-permission Android:name="Android.permission.INTERNET" /> dans AndroidManifest.xml.
  2. Ajoutez implementation 'com.google.Android.gms:play-services-auth:12.0.1', implementation 'com.google.apis:google-api-services-people:v1-rev255-1.23.0' et implementation 'com.google.api-client:google-api-client-Android:1.23.0' dans dependencies {} sur build.gradle.
  3. Dans mon cas, je rétrograde les variables compileSdkVersion, targetSdkVersion et appcompat-v7 de 27 à 26 depuis que j'ai été averti après l'ajout de dépendances n ° 2.
  4. Ajoutez signingConfigs { debug { storeFile file('<path to jks file>') keyAlias '<your key alias>' keyPassword '<your key password>' storePassword '<your store password>' } } Dans build.gradle, fichier jks généré à partir de Build -> Generated Signed APK... -> Create new...
  5. keytool -exportcert -keystore <path to jks file> -list -v pour obtenir la clé SHA1 hex, puis visite la console de lecture, renseignez le nom du projet, le nom du package de l'application, la clé SHA1.
  6. Activez People API à l’adresse https://console.developers.google.com/apis/library/people.googleapis.com/?project= [votre identifiant de projet] ", identifiant de projet pouvant être obtenu à partir de la console de lecture. Remarque que ce n'est pas le nom du projet.
  7. J'ai remarqué qu'il n'y avait pas un tel Scopes.BIRTHDAY dans la bibliothèque, je dois donc coder en dur l'URL endpoint URL"https://www.googleapis.com/auth/user.birthday.read", que le lien peut obtenir à partir de https://developers.google.com/people/v1/how-tos/authorizing#profile- scopes OR "Afficher les portées" dans le panneau "Essayer l'API" à https://developers.google.com/people/api/rest/v1/people/get
  8. L'anniversaire est une liste, et il peut boucler 2 éléments de date, un élément manquant d'année dans mon cas. Mon code remplace toujours pour sauvegarder ces 2 éléments. Il y a peut-être une meilleure façon de le gérer.
  9. Le sexe ne peut rentrer que s'il n'est pas privé. Anniversaire pas une telle restriction.
  10. Étant donné que les appareils Android ont besoin d'environ 1 minute de retard pour obtenir le nouveau nom de compte créé, vous devrez peut-être utiliser la portée de PROFILE au lieu des simples account.getGivenName() et account.getFamilyName().
3
林果皞

Voici ma réponse, espérons que cela vous aidera.

Plus.PeopleAPI est obsolète dans les services de Google Play 9.4 en tant que notes de déclaration de Google. Veuillez vous reporter aux solutions suivantes à l'aide de l'API Google People:

Obtenir les détails de la personne dans le nouveau compte Google Connexion à Play Services 8.3 (réponse d'Isabella Chen);

Impossible d'obtenir un anniversaire privé à partir d'un compte Google Plus bien qu'une demande explicite

FIN DE MISE À JOUR

Tout d’abord, assurez-vous d’avoir créé un profil Google+ pour votre compte Google. Ensuite, vous pouvez vous référer au code suivant:

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

et

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

Ensuite

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

Dans le fichier build.gradle

// Dépendance pour 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'

Vous pouvez consulter l'exemple de projet belo GitHub. J'espère que cela aide et résolu votre problème.

https://github.com/ngocchung/GoogleSignInDemo

Si vous voulez la dernière intégration, veuillez suivre le lien ci-dessous, qui contient une documentation de Nice, ainsi qu'un bref aperçu du code et de tous les paramètres.

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();
}
2
jyubin patel

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

Authentification 

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

J'espère que ça aide :) 

1
thanhbinh84

ajoutez ceci dans vos dépendances build.gradle

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

essaye ça 

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

}
}
0
Saurabh Mistry

En utilisant People api's, vous pouvez récupérer les détails de la date de naissance et du sexe.

Utilisez la dépendance "com.google.apis: google-api-services-people: v1-rev4-1.22.0" pour inclure les API des personnes.

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