Google Play Games, Firebase y el nuevo inicio de sesión de Google

Mi juego utiliza Google Play Games y Firebase (para Rankings System, porque lamentablemente no se puede reducir la puntuación en las tablas de clasificación de Google).

En el pasado utilicé la manera obsoleta de Plus.AccountApi.getAccountName sesión en Firebase a través de Plus.AccountApi.getAccountName y amigos …

Así que intenté convertir el nuevo inicio de sesión de Google, pero aparentemente no se puede utilizar en combinación con Google Play Games:

 Auth.GOOGLE_SIGN_IN_API cannot be used with Games.API 

Mi objetivo era liberar la dependencia de Google+ (ya que Google Play Games ya no la requiere) y el permiso GET_ACCOUNTS.

¿Cómo puedo iniciar sesión en Firebase sin Google+ y GET_ACCOUNTS y ​​sin el nuevo inicio de sesión de Google? ¿Puedo? Tal vez la creación de dos GoogleApiClients separados sería una solución?

Bueno, simplemente terminé creando dos GoogleApiClients separados: uno para Google Play Games y otro para Firebase (con el nuevo inicio de sesión de Google). No veo ningún problema con este enfoque, y me deshice de la dependencia de Google + y el permiso GET_ACCOUNTS.

Para utilizar Api de Google Play Games con Firebase, sigue estos pasos:

*** Nota: getGamesServerAuthCode es la forma recomendada de Google; Aunque se deprecie. Es posible que se hayan olvidado de eliminar la anotación de desaprobación al publicar en público en general.

Paso 1: Cuando haya iniciado sesión correctamente; Obtener el código de autorización. Usted puede usar onSignInSucceeded () por ejemplo. Sólo asegúrese de que el cliente API está conectado.

 Games.getGamesServerAuthCode(gameHelper.getApiClient(), [web_client_id]).setResultCallback(new ResultCallback<Games.GetServerAuthCodeResult>() { @Override public void onResult(@NonNull Games.GetServerAuthCodeResult result) { if (result.getStatus().isSuccess()) { String authCode = result.getCode(); exchangeAuthCodeForToken(authCode); } } }); 

Paso 2: intercambiar el código de autorización de un token.

 class AuthToken { String access_token; String token_type; int expires_in; String id_token; } void exchangeAuthCodeForToken(final String authCode) { AsyncTask<Void, Void, AuthToken> task = new AsyncTask<Void, Void, AuthToken>() { @Override protected AuthToken doInBackground(Void... voids) { try { URL url = new URL("https://www.googleapis.com/oauth2/v4/token"); Map<String, Object> params = new LinkedHashMap<>(); params.put("code", authCode); params.put("client_id", "[web_client_id]"); params.put("client_secret", "[secret]"); params.put("redirect_uri", "[redirect_uri]"); params.put("grant_type", "authorization_code"); StringBuilder postData = new StringBuilder(); for (Map.Entry<String, Object> param : params.entrySet()) { if (postData.length() != 0) postData.append('&'); postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); postData.append('='); postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); } byte[] postDataBytes = postData.toString().getBytes("UTF-8"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Host", "www.googleapis.com"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setDoOutput(true); conn.getOutputStream().write(postDataBytes); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); // Build the string StringBuilder sb = new StringBuilder(); for (int c; (c = in.read()) >= 0; ) { sb.append((char) c); } // Convert JSON to a Java Object GsonBuilder builder = new GsonBuilder(); Gson gson = builder.create(); AuthToken token = gson.fromJson(sb.toString(), AuthToken.class); // Disconnect conn.disconnect(); return token; } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(AuthToken token) { // Authorize Firebase with Games API firebaseAuthWithGamesApi(token.id_token); } }.execute(); } 

Paso 3: Utilice el código de autorización para iniciar sesión con Firebase.

 private void firebaseAuthWithGamesApi(String authToken) { AuthCredential credential = GoogleAuthProvider.getCredential(authToken, null); mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); // If sign in fails, display a message to the user. If sign in succeeds // the auth state listener will be notified and logic to handle the // signed in user can be handled in the listener. if (!task.isSuccessful()) { Log.w(TAG, "signInWithCredential", task.getException()); } } }); } 
  • Cómo resolver el problema de "com.google.android.gms.auth.api.signin.internal.SignInHubActivity" ActivityNotFoundException in google signin integration
  • Obtenga los detalles de la persona en la nueva conexión de Google Play Services 8.3
  • Android: ¿Cómo obtener un token de actualización mediante Google Sign-In API?
  • Cómo obtener el botón predeterminado de Google+ en la aplicación de Android
  • Google Android de inicio de sesión está parpadeando un pequeño cuadro blanco vacío al iniciar sesión en un usuario
  • Google Sign In no funciona después de publicado en playstore
  • Cerrar sesión desde google play
  • No se puede resolver el símbolo 'Auth' para la integración de Google en android studio
  • No se puede encontrar la variable de símbolo GoogleAuthUtil después de actualizar a los servicios de Google Play.
  • Autenticación del lado del servidor de inicio de sesión de Google para Android en Nodejs
  • MGoogleApiClient no se puede lograr en otra actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.