trabajo saber recuperar play perfil juegos google eliminar desactivar cuenta como activar android google-signin google-plus-signin

saber - perfil de trabajo android



¿Cómo obtener un perfil como género desde el inicio de sesión de Google en Android? (5)

Cree las opciones de inicio de sesión de Google como a continuación. Esto funciona perfecto para mi

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

Quiero integrar el inicio de sesión de Google en mi aplicación, cuando el usuario inicie sesión por primera vez, crearé una cuenta vinculada a esto, así que necesito algunos perfiles como género, configuración regional, etc. e intenté como el documento de inicio de sesión de Google y rápido muestra de inicio:

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

cuando haga clic para iniciar sesión llamaré:

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

inicio de sesión exitoso, puedo obtener una estructura de datos GoogleSignInResult en onActivityResult, de GoogleSignInResult puedo obtener un GoogleSignInAccount, que solo contiene DisplayName, correo electrónico e identificación. pero cuando estoy en https://developers.google.com/apis-explorer/#p/ , puedo obtener perfiles como género, locale. ¿Hay algo que me haya perdido?

y probé google plus api, parece que puedo obtener lo que quiero. pero no sé cómo usarlo, el documento dice crear cliente de esta manera:

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

pero cuando lo uso, hacer clic en el botón de inicio de sesión provocará un bloqueo de la aplicación

Actualización: problemas al actualizar a la nueva versión de inicio de sesión de google Falta api_key / clave actual con Google Services 3.0.0


Después de iniciar sesión, haga:

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


El material de personas Plus está en desuso, no lo uses más. La forma de hacerlo es con la API de Google People Habilite esta API en su proyecto. Si no lo hace, la excepción lanzada en Studio incluye un enlace directamente a su proyecto para habilitarlo (bueno).

Incluya las siguientes dependencias en el build.gradle de su aplicación:

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

Haga un GoogleSignIn autorizado como de costumbre. No necesita ningún Scopes o Api que no sean los de la cuenta básica, por ejemplo

GoogleSignInOptions.DEFAULT_SIGN_IN .addApi(Auth.GOOGLE_SIGN_IN_API, gso)

y las solicitudes de correo electrónico y perfil es todo lo que necesita.

Ahora, una vez que tenga un resultado de inicio de sesión exitoso, puede obtener la cuenta, incluido el correo electrónico (tal vez podría hacerlo también con la identificación).

final GoogleSignInAccount acct = googleSignInResult.getSignInAccount();

Ahora la nueva parte: cree y ejecute una AsyncTask para llamar a la API de Google People después de recibir el correo electrónico de confirmación.

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

Aquí está la 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; } }

Aquí está lo que está disponible de la Person

Si pega el código en su proyecto, asegúrese de que las importaciones se resuelvan correctamente. Hay nombres de clase superpuestos con algunas de las API más antiguas.


Pasé algún tiempo para encontrar una solución, así que permítanme compartir la forma actual de lograrlo.

Debe ampliar las opciones de inicio de sesión de Google de esta manera:

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

Luego, en respuesta, recibe el objeto GoogleSignInResult con GoogleSignInAccount. Extrae tanto el identificador de token como el código de autenticación.

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

Lo que debe hacer a continuación es obtener access_token con la solicitud POST:

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

La solicitud se puede hacer en la aplicación de Android, pero recomiendo hacerlo en el lado del servidor, ya que no es seguro mantener client_secret en la aplicación de Android. Pero depende de ti. La respuesta para dicha solicitud se ve así:

{ "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" }

Luego puede consultar el punto final del perfil de usuario para obtener detalles del usuario:

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

La respuesta se ve así:

{ "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": "[email protected]", "email_verified": true, "gender" : "male", "locale": "en" }

Sin embargo, si el usuario no tiene acceso público a la información sobre él, el campo de género puede faltar aquí. Probablemente necesite solicitar un alcance adicional en la solicitud de inicio de sesión de Google, pero no lo comprobé. (las opciones para compartir están en la página de la cuenta de Google: https://myaccount.google.com/personal-info )


ACTUALIZAR:

Dado que Plus.PeopleApi ha quedado en desuso en los servicios de Google Play 9.4 como notas de la declaración de Google , consulte las siguientes soluciones que utilizan la API de Google People en su lugar:

Obtenga detalles de la persona en el nuevo inicio de sesión de Google en Play Services 8.3 (la respuesta de Isabella Chen);

No se puede obtener un cumpleaños privado de la cuenta de Google Plus aunque la solicitud explícita

FIN DE ACTUALIZACIÓN

En primer lugar, asegúrese de haber creado el perfil de Google+ para su cuenta de Google. Luego puede consultar el siguiente código:

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

y

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

Entonces

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

Dentro del archivo 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''

Puede echar un vistazo al proyecto de muestra My GitHub . ¡Espero que esto ayude!