Acceso para juegos de Android

Para acceder a la funcionalidad de los Servicios de juego de Google Play, tu juego debe proporcionar la cuenta del jugador que accedió. En esta documentación, se describe cómo implementar una experiencia perfecta de acceso en tu juego.

El SDK de la versión 2 de los Servicios de juego de Google Play ofrece varias mejoras que aumentan la cantidad de usuarios que acceden a tu juego y facilitan el desarrollo:

  • Mejoras para los usuarios:
    • Después de seleccionar una cuenta predeterminada, los usuarios acceden sin tener que interactuar con un mensaje.
    • Los usuarios ya no necesitan descargar la app de Play Juegos para acceder con los Servicios de juego de Play ni para crear una cuenta nueva.
    • Ahora los usuarios pueden administrar sus cuentas de los Servicios de juego de Play para varios juegos desde una sola página.
  • Mejoras para desarrolladores:
    • El código de cliente ya no necesita controlar el flujo de acceso o salida, ya que el acceso se activa automáticamente cuando se inicia el juego, y la administración de la cuenta se controla en la configuración del SO.

Integración de clientes nuevos

En esta sección, se muestra cómo integrar clientes nuevos con la versión 2 de Acceso a los Servicios de juego de Play.

Agrega la dependencia

Agrega la dependencia del SDK de Servicios de juego de Play al archivo build.gradle en el nivel raíz de tu app. Si usas Gradle, puedes agregar o actualizar la dependencia de la siguiente manera:

dependencies {
 implementation "com.google.android.gms:play-services-games-v2:+"
}

Define el ID del proyecto

Para agregar el ID del proyecto del SDK de los Servicios de juego de Play a tu app, sigue estos pasos:

  1. En el archivo AndroidManifest.xml de tu app, agrega el siguiente elemento <meta-data> y los atributos al elemento <application>:

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    

    Define la referencia @string/game_services_project_id del recurso de strings usando como valor el ID del proyecto de los Servicios de juego. Puedes encontrar el ID del proyecto de los Servicios de juego debajo del nombre del juego en la página Configuración de Google Play Console.

  2. En el archivo res/values/strings.xml, agrega una referencia del recurso de strings y establece el ID del proyecto como el valor. En Google Play Console, puedes encontrar el ID del proyecto debajo del nombre del juego en la página Configuración. Por ejemplo:

    <!-- res/values/strings.xml -->
    <resources>
      <!-- Replace 0000000000 with your game’s project id. Example value shown above.  -->
      <string translatable="false"  name="game_services_project_id"> 0000000000 </string>
    </resources>
    

Inicializa el SDK

Inicializa el SDK de Play Juegos en la devolución de llamada onCreate(..) de tu clase Application.

import com.google.android.gms.games.PlayGamesSdk;

...

@Override
public void onCreate(){
  super.onCreate();
  PlayGamesSdk.initialize(this);
}

Obtén el resultado de acceso

Cuando se inicie el juego, siempre intentará que el usuario acceda. Para autenticar al usuario, debes verificar que este accedió de forma correcta y, luego, obtener su ID de jugador.

A fin de verificar el intento de acceso, llama a GamesSignInClient.isAuthenticated() y usa addOnCompleteListener para recuperar los resultados. Por ejemplo:

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());

gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
  boolean isAuthenticated =
    (isAuthenticatedTask.isSuccessful() &&
     isAuthenticatedTask.getResult().isAuthenticated());

  if (isAuthenticated) {
    // Continue with Play Games Services
  } else {
    // Disable your integration with Play Games Services or show a
    // login button to ask  players to sign-in. Clicking it should
    // call GamesSignInClient.signIn().
  }
});

Si el usuario decide no acceder cuando se inicia el juego, puedes elegir, de manera opcional, continuar mostrando un botón con el ícono de Play Juegos y volver a tratar de que el usuario acceda con una llamada a GamesSignInClient.signIn() si presiona el botón.

Después de verificar que el usuario accedió, puedes recuperar el ID de jugador para identificarlo. Por ejemplo:

PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
    // Get PlayerID with mTask.getResult().getPlayerId()
  }
);

Migra a la versión 2 de Acceso de los Servicios de juego de Play

En esta sección, se describe cómo migrar tu código de cliente de la versión 1 a la versión 2 de los Servicios de juego de Play.

El nuevo SDK contiene cuatro cambios importantes que debes tener en cuenta para mejorar el acceso:

  1. El acceso se activa automáticamente cuando se inicia el juego. En lugar de utilizar el GoogleSignInClient del SDK de GoogleSignIn para acceder, puedes usar GamesSignInClient.isAuthenticated() a fin de recuperar el resultado del intento de acceso automático.
  2. Las clases de fábrica del cliente ya no necesitarán un objeto GoogleSignInAccount pasado. No se pueden solicitar permisos de OAuth adicionales (se solicitará GAMES_LITE automáticamente).
  3. Ahora, los tokens de autenticación se proporcionan a través del GamesSignInClient.requestServerSideAccess() en el SDK de los Servicios de juego de Play.
  4. Se quitó el método de salida, y ya no se requerirá un botón del juego para acceder a los Servicios de juego de Play ni para salir de ellos.

Además, tu juego tendrá accesos adicionales debido al acceso automático cuando se inicia el juego. Como resultado, debes consultar la administración de cuotas para asegurarte de que tu juego no supere la cuota de solicitudes de acceso.

Segmenta el nuevo repositorio de Maven del SDK

Si usas el sistema de compilación de Gradle, puedes cambiar tu dependencia al artefacto com.google.android.gms:play-services-games-v2:+ en el archivo build.gradle de tu módulo. Por ejemplo:

dependencies {
 implementation "com.google.android.gms:play-services-games-v2:+"
}

Inicializa el SDK

Inicializa el SDK de Play Juegos en la devolución de llamada onCreate(..) de tu clase Application. Por ejemplo:

import com.google.android.gms.games.PlayGamesSdk;

...

@Override
public void onCreate(){
  super.onCreate();
  PlayGamesSdk.initialize(this);
}

Quita las llamadas de acceso y salida

Si no especificas permisos adicionales, la migración de tu caso de uso debería ser sencilla.

  1. Quita las llamadas de acceso con la API de GoogleSignIn. El acceso siempre se realizará cuando se inicie el juego. En su lugar, escucha el resultado del intento de acceso automático mediante GamesSignInClient.isAuthenticated().

    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());
    
    gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
      boolean isAuthenticated =
        (isAuthenticatedTask.isSuccessful() &&
         isAuthenticatedTask.getResult().isAuthenticated());
    
      if (isAuthenticated) {
        // Continue with Play Games Services
      } else {
        // Disable your integration with Play Games Services or show a
        // login button to ask  players to sign-in. Clicking it should
        // call GamesSignInClient.signIn().
      }
    });
    
  2. Quita todas las llamadas para salir, ya que la administración de la cuenta ahora se encuentra dentro del SO y de la configuración de la app de Play Juegos.

  3. Si el jugador accedió de forma correcta, quita el botón de acceso de Play Juegos de tu juego. Si el usuario decide no acceder cuando se inicia el juego, puedes elegir, de manera opcional, continuar mostrando un botón con el ícono de Play Juegos y activar el proceso de acceso con GamesSignInClient.signIn().

  4. Después de verificar que el usuario accedió, puedes recuperar el ID de jugador para identificarlo.

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
  5. Quita tu dependencia de la API de GoogleSignIn si ya no la usas.

Actualiza los nombres de clases de cliente

Cuando crees clientes (p. ej., LeaderboardsClient o AchievementsClient), usa PlayGames.getFooClient() en lugar de Games.getFooClient().

Solicita acceso al servidor

Cuando solicites acceso al servidor, usa GamesSignInClient.requestServerSideAccess() en lugar de GoogleSignInAccount.getServerAuthCode().

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
gamesSignInClient
  .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID,
                           /*forceRefreshToken=*/ false)
  .addOnCompleteListener( task -> {
    if (task.isSuccessful()) {
      String serverAuthToken = task.getResult();
      // Send authentication code to the backend game server to be
      // exchanged for an access token and used to verify the
      // player via the Play Games Services REST APIs.
    } else {
      // Failed to retrieve authentication code.
    }
});

Quita permisos adicionales

Con la versión 2 de los Servicios de juego de Play, no podrás solicitar ningún permiso adicional. Si, de todos modos, necesitas solicitar permisos adicionales, te recomendamos que uses el SDK de Acceso con Google junto con los Servicios de juego de Play.

Migración desde GoogleApiClient

En el caso de las integraciones existentes, es posible que tu juego dependa de la variante de API de GoogleApiClient del SDK de los Servicios de juego de Play. Esta función dejó de estar disponible a fines de 2017 y se reemplazó por clientes "sin conexión". Para migrar, puedes reemplazar la clase GoogleApiClient por un equivalente "sin conexión". Luego, deberás seguir las instrucciones anteriores para migrar tu juego de la versión 1 a la versión 2. A continuación, se muestra un mapeo de clases comunes:

com.google.android.gms.games.achievement.Achievements ->
    com.google.android.gms.games.AchievementsClient

com.google.android.gms.games.leaderboard.Leaderboard ->
    com.google.android.gms.games.LeaderboardsClient

com.google.android.gms.games.snapshot.Snapshots ->
    com.google.android.gms.games.SnapshotsClient

com.google.android.gms.games.stats.PlayerStats ->
    com.google.android.gms.games.PlayerStatsClient

com.google.android.gms.games.Players ->
    com.google.android.gms.games.PlayersClient

com.google.android.gms.games.GamesStatusCodes ->
    com.google.android.gms.games.GamesClientStatusCodes