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 …
- Obtención de 'E / TokenRequestor: Tiene configuraciones relacionadas con OAuth2 erróneas. Error detallado: INVALID_AUDIENCE 'incluso después de proporcionar identificaciones de cliente precisas
- GoogleSignInResult devuelve DEVELOPER_ERROR en la aplicación de Android mediante Firebase
- ¿Inicia sesión de Google no funciona en Android?
- GoogleApiClient no está conectado si se utiliza desde fragmento
- Google signIn no funciona en el modo de liberación apk android
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?
- Google Android Ingresar: compruebe si el usuario está conectado
- "GoogleApiClient no está conectado todavía" al cerrar la sesión cuando se utiliza la autorización de Firebase con google inicie sesión
- ¿Cómo obtener un perfil como género de google signin en Android?
- Android Google SignIn no funciona en modo de depuración: GoogleSignInResult es falso
- Ocurrió un INTERNAL_ERROR cuando requestEmail de GoogleSignInOptions Android
- ¿Cómo obtener el token de acceso después de que el usuario haya iniciado sesión desde Gmail en Android?
- Gradle falla en la construcción con "Missing project_info object"
- ¿Cómo obtener el token de acceso con el nuevo inicio de sesión de Google con los servicios de juego 8.3?
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()); } } }); }
- Acceda a las preferencias compartidas de diferentes actividades (Android)
- Target Platform está deshabilitado en Xamarin Studio?