Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Plus.PeopleApi.getCurrentPerson obsoleta en los servicios de Play 8.4. ¿Cómo obtener el nombre, apellido y sexo del usuario usando GoogleSignInApi?

Con Play Services 8.4, el método getCurrentPerson está obsoleto y estaba usando PeopleApi para obtener el nombre, apellido y género del usuario.

¿Puede alguien decirme cómo obtener la información de usuario en el que se firmó utilizando otro método?

5 Solutions collect form web for “Plus.PeopleApi.getCurrentPerson obsoleta en los servicios de Play 8.4. ¿Cómo obtener el nombre, apellido y sexo del usuario usando GoogleSignInApi?”

La API de inicio de sesión de Google ya puede proporcionarle el nombre, la dirección de correo electrónico y la URL de la imagen de perfil. Si necesita otra información de perfil como género, úsela en conjunto con la nueva API de personas

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

A continuación, escriba el código de inicio de sesión,

 // Make sure your GoogleSignInOptions request profile & email GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); // Follow official doc to sign-in. // https://developers.google.com/identity/sign-in/android/sign-in 

Al manejar el resultado de inicio de sesión:

 GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { GoogleSignInAccount acct = result.getSignInAccount(); String personName = acct.getDisplayName(); String personGivenName = acct.getGivenName(); String personFamilyName = acct.getFamilyName(); String personEmail = acct.getEmail(); String personId = acct.getId(); Uri personPhoto = acct.getPhotoUrl(); } 

Use People Api para recuperar información detallada de la persona.

 /** Global instance of the HTTP transport. */ private static HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport(); /** Global instance of the JSON factory. */ private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); // On worker thread GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(MainActivity.this, Scopes.PROFILE); credential.setSelectedAccount(new Account(personEmail, "com.google")); People service = new People.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName(APPLICATION_NAME /* whatever you like */) .build(); // All the person details Person meProfile = service.people().get("people/me").execute(); // eg Gender List<Gender> genders = meProfile.getGenders(); String gender = null; if (genders != null && genders.size() > 0) { gender = genders.get(0).getValue(); } 

Echa un vistazo a JavaDoc para ver qué otra información de perfil se puede obtener.

Actualización: Compruebe la respuesta de Isabella. Esta respuesta utiliza material obsoleto.

Encontré la solución yo mismo así que la estoy fijando aquí si cualquier persona hace frente al mismo problema.

Aunque estaba buscando una solución para usar GoogleSignInApi para obtener información del usuario, no pude encontrar eso y creo que necesitamos usar el Plus Api para obtener información como género.

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } } 

HandleSignInResult

 private void handleSignInResult(GoogleSignInResult result) { Log.d(TAG, "handleSignInResult:" + result.isSuccess()); if (result.isSuccess()) { GoogleSignInAccount acct = result.getSignInAccount(); Toast.makeText(getApplicationContext(),""+acct.getDisplayName(),Toast.LENGTH_LONG).show(); 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(TAG,"Person loaded"); Log.d(TAG,"GivenName "+person.getName().getGivenName()); Log.d(TAG,"FamilyName "+person.getName().getFamilyName()); Log.d(TAG,("DisplayName "+person.getDisplayName())); Log.d(TAG,"Gender "+person.getGender()); Log.d(TAG,"Url "+person.getUrl()); Log.d(TAG,"CurrentLocation "+person.getCurrentLocation()); Log.d(TAG,"AboutMe "+person.getAboutMe()); Log.d(TAG,"Birthday "+person.getBirthday()); Log.d(TAG,"Image "+person.getImage()); } }); //mStatusTextView.setText(getString(R.string.signed_in_fmt, acct.getDisplayName())); //updateUI(true); } else { //updateUI(false); } } 

Hola, he encontrado una forma alternativa para el último inicio de sesión de Google Plus, utiliza el método siguiente:

 GoogleApiClient mGoogleApiClient; private void latestGooglePlus() { GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestProfile().requestEmail().requestScopes(Plus.SCOPE_PLUS_LOGIN, Plus.SCOPE_PLUS_PROFILE, new Scope("https://www.googleapis.com/auth/plus.profile.emails.read")) .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(Plus.API) .build(); Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, YOURREQUESTCODE); } 

Y en el resultado de la actividad, utilice el siguiente código:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.e("Activity Res", "" + requestCode); if (requestCode == YOURREQUESTCODE) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { GoogleSignInAccount acct = result.getSignInAccount(); acct.getPhotoUrl(); acct.getId(); Log.e(TAG, acct.getDisplayName()); Log.e(TAG, acct.getEmail()); 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(TAG, (person.getName().getGivenName())); Log.d(TAG, (person.getName().getFamilyName())); Log.d(TAG, (person.getDisplayName())); Log.d(TAG, (person.getGender() + "")); Log.d(TAG, "person.getCover():" + person.getCover().getCoverPhoto().getUrl()); } }); } } } 

Finalmente su onClick será:

 @Override public void onClick(View v) { switch (v.getId()) { case R.id.txtGooglePlus: latestGooglePlus(); break; default: break; } } 

Lo primero que debes hacer es seguir la orientación de Google en Agregar inicio de sesión de Google a tu aplicación para Android .

Entonces usted tiene que cambiar el GoogleSignInOptions a:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestProfile() .requestEmail() .build(); 

Si necesitas agregar otros ámbitos puedes hacerlo así:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestScopes(new Scope(Scopes.DRIVE_APPFOLDER)) .requestProfile() .requestEmail() .build(); 

Y en 'onActivityResult' dentro 'if (result.isSuccess ()) {' insert this:

 new requestUserInfoAsync(this /* Context */, acct).execute(); 

Y crear este método:

 private static class requestUserInfoAsync extends AsyncTask<Void, Void, Void> { // Global instance of the HTTP transport. private static HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport(); // Global instance of the JSON factory. private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); private Context context; private GoogleSignInAccount acct; private String birthdayText; private String addressText; private String cover; public requestUserInfoAsync(Context context, GoogleSignInAccount acct) { this.context = context; this.acct = acct; } @Override protected Void doInBackground(Void... params) { // On worker thread GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2( context, Collections.singleton(Scopes.PROFILE) ); credential.setSelectedAccount(new Account(acct.getEmail(), "com.google")); People service = new People.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName(context.getString(R.string.app_name) /* whatever you like */) .build(); // All the person details try { Person meProfile = service.people().get("people/me").execute(); List<Birthday> birthdays = meProfile.getBirthdays(); if (birthdays != null && birthdays.size() > 0) { Birthday birthday = birthdays.get(0); // DateFormat.getDateInstance(DateFormat.FULL).format(birthdayDate) birthdayText = ""; try { if (birthday.getDate().getYear() != null) { birthdayText += birthday.getDate().getYear() + " "; } birthdayText += birthday.getDate().getMonth() + " " + birthday.getDate().getDay(); } catch (Exception e) { e.printStackTrace(); } } List<Address> addresses = meProfile.getAddresses(); if (addresses != null && addresses.size() > 0) { Address address = addresses.get(0); addressText = address.getFormattedValue(); } List<CoverPhoto> coverPhotos = meProfile.getCoverPhotos(); if (coverPhotos != null && coverPhotos.size() > 0) { CoverPhoto coverPhoto = coverPhotos.get(0); cover = coverPhoto.getUrl(); } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); Log.i("TagTag", "birthday: " + birthdayText); Log.i("TagTag", "address: " + addressText); Log.i("TagTag", "cover: " + cover); } } 

Usando esto, puede utilizar los métodos dentro de 'Person meProfile' para obtener otra información, pero sólo puede obtener la información pública del usuario de lo contrario será nulo.

Sólo para añadir a la respuesta de Hardy arriba, que me guió en la dirección correcta.

Terminé usando dos llamadas a GoogleApiClient como no pude conseguir lo que Hardy tiene arriba para trabajar.

Mi primera llamada es a GoogleSignInApi

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestProfile() .requestEmail() .requestIdToken(MY_GOOGLE_SERVER_CLIENT_ID) .build(); mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, ThinQStepsConstants.REQUEST_CODE_GOOGLE_SIGN_IN); 

Esto entonces me da la primera parte a través de la onActivityResult, igual que Hardy. Sin embargo, a continuación, utilizar la llamada a la GoogleApiClient.Builder de nuevo

 mGoogleApiClientPlus = new GoogleApiClient.Builder(getActivity()) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Plus.API) .addScope(Plus.SCOPE_PLUS_PROFILE) .build(); mGoogleApiClientPlus.connect(); 

Ahora puedo acceder al Plus.PeopleApi a través de la devolución de llamada onConnected

 @Override public void onConnected(Bundle connectionHint) { Log.i(TAG, "onConnected"); Plus.PeopleApi.load(mGoogleApiClientPlus, mGoogleId).setResultCallback(new ResultCallback<People.LoadPeopleResult>() { @Override public void onResult(@NonNull People.LoadPeopleResult loadPeopleResult) { Person currentPerson = loadPeopleResult.getPersonBuffer().get(0); } }); } 

Con las desconexiones y revocaciones apropiadas.

Puede notar que mi código utiliza las mismas devoluciones de llamada, que debo ordenar, pero el principal está allí.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.