A seguito del ritiro dell'API
Google Sign-In, rimuoveremo l'SDK v1 per i giochi nel 2026. Dopo febbraio 2025, non potrai pubblicare
su Google Play titoli che sono stati integrati di recente con l'SDK v1 per i giochi. Ti consigliamo di utilizzare l'SDK v2 per i giochi.
Anche se i titoli esistenti con le precedenti integrazioni di giochi v1 continueranno a funzionare per un paio di anni, ti consigliamo di
eseguire la migrazione alla v2
a partire da giugno 2025.
Questa guida riguarda l'utilizzo dell'SDK v1 dei servizi per i giochi di Play. Per informazioni
sull'ultima versione dell'SDK, consulta la
documentazione della versione 2.
Per accedere alla funzionalità di Google Play Services per i giochi, il tuo gioco deve fornire l'account del giocatore che ha eseguito l'accesso. Se il giocatore non è autenticato, il tuo gioco potrebbe riscontrare errori quando effettua chiamate alle API Google Play Games Services. Questa documentazione descrive come implementare un'esperienza di accesso senza interruzioni nel tuo gioco.
Implementare l'accesso del giocatore
La classe GoogleSignInClient
è il punto di accesso principale per recuperare l'account del giocatore attualmente
connesso e per accedere se non l'ha ancora fatto nella tua app sul
dispositivo.
Per creare un client di accesso:
Crea un client di accesso tramite l'oggetto
GoogleSignInOptions
, come mostrato nello snippet di codice seguente. NellaGoogleSignInOptions.Builder
per configurare l'accesso, devi specificareGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
.GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
Se vuoi utilizzare un
SnapshotsClient
, aggiungi.requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
al tuoGoogleSignInOptions.Builder
come mostrato nello snippet di codice seguente:GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) .build();
Chiama il metodo
GoogleSignIn.getClient()
e trasmetti le opzioni che hai configurato nei passaggi precedenti. Se la chiamata va a buon fine, l'API Google Sign-In restituisce un'istanza diGoogleSignInClient
.
Controllare se il giocatore ha già eseguito l'accesso
Puoi verificare se è già stato eseguito l'accesso a un account
sul dispositivo attuale utilizzando GoogleSignIn.getLastSignedInAccount()
e se questo account dispone già delle autorizzazioni richieste utilizzando
GoogleSignIn.hasPermissions()
.
Se entrambe le condizioni sono vere, ovvero getLastSignedInAccount()
restituisce un valore
non nullo e hasPermissions()
restituisce true
, puoi utilizzare in sicurezza
l'account restituito da getLastSignedInAccount()
, anche se il dispositivo è
offline.
Eseguire un accesso silenzioso
Puoi chiamare silentSignIn()
per recuperare l'account del giocatore attualmente connesso
e provare ad accedere senza visualizzare un'interfaccia utente se ha
eseguito l'accesso alla tua app su un altro dispositivo.
Il metodo silentSignIn()
restituisce un Task<GoogleSignInAccount>
. Al termine dell'attività,
imposta il campo GoogleSignInAccount
dichiarato in precedenza sull'account di accesso che l'attività
restituisce come risultato o su null
, indicando che non è presente un utente che ha eseguito l'accesso.
Se il tentativo di accesso automatico non va a buon fine, puoi inviare facoltativamente l'intent di accesso per visualizzare un'interfaccia utente di accesso, come descritto in Eseguire un accesso interattivo.
Poiché lo stato del giocatore che ha eseguito l'accesso può cambiare quando l'attività non è in primo piano, ti consigliamo di chiamare silentSignIn()
dal metodo onResume()
dell'attività.
Per eseguire l'accesso in modalità silenziosa, segui questi passaggi:
- Chiama il metodo
silentSignIn()
suGoogleSignInClient
per avviare il flusso di accesso silenzioso. Questa chiamata restituisce un oggettoTask<GoogleSignInAccount>
che contiene unGoogleSignInAccount
se l'accesso automatico è riuscito. - Gestisci l'esito positivo o negativo dell'accesso del giocatore eseguendo l'override di
OnCompleteListener
.- Se l'attività di accesso è andata a buon fine, recupera l'oggetto
GoogleSignInAccount
chiamandogetResult()
. - Se l'accesso non è andato a buon fine, puoi inviare un intent di accesso per avviare un flusso di accesso interattivo.
Per un elenco di listener di callback aggiuntivi che puoi utilizzare, consulta la
guida per sviluppatori dell'API Tasks
e il
Task
riferimento API.
- Se l'attività di accesso è andata a buon fine, recupera l'oggetto
Il seguente snippet di codice mostra come la tua app può eseguire l'accesso automatico:
private void signInSilently() { GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN; GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); if (GoogleSignIn.hasPermissions(account, signInOptions.getScopeArray())) { // Already signed in. // The signed in account is stored in the 'account' variable. GoogleSignInAccount signedInAccount = account; } else { // Haven't been signed-in before. Try the silent sign-in first. GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOptions); signInClient .silentSignIn() .addOnCompleteListener( this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { // The signed in account is stored in the task's result. GoogleSignInAccount signedInAccount = task.getResult(); } else { // Player will need to sign-in explicitly using via UI. // See [sign-in best practices](http://developers.google.com/games/services/checklist) for guidance on how and when to implement Interactive Sign-in, // and [Performing Interactive Sign-in](http://developers.google.com/games/services/android/signin#performing_interactive_sign-in) for details on how to implement // Interactive Sign-in. } } }); } } @Override protected void onResume() { super.onResume(); signInSilently(); }
Se il tentativo di accesso automatico non va a buon fine, puoi chiamare
getException()
per
ottenere un ApiException
con il codice di stato dettagliato. Un codice di stato CommonStatusCodes.SIGN_IN_REQUIRED
indica che il giocatore deve intraprendere un'azione esplicita per accedere. In questo caso, l'app deve
avviare un flusso di accesso interattivo come descritto nella sezione successiva.
Eseguire un accesso interattivo
Per accedere con l'interazione del giocatore, la tua app deve avviare l'intent di accesso. In caso di esito positivo,
l'API Google Sign-In mostra un'interfaccia utente che chiede al giocatore di inserire le proprie credenziali
per accedere. Questo approccio semplifica lo sviluppo dell'app, poiché l'attività di accesso gestisce
scenari come la necessità di aggiornare Google Play Services o mostrare richieste di consenso, per conto della tua app. Il risultato viene restituito tramite il
callback
onActivityResult
.
Per eseguire l'accesso in modo interattivo:
Chiama
getSigninIntent()
suGoogleSignInClient
per ottenere un intent di accesso, quindi chiamastartActivity()
e trasmetti l'intent. Il seguente snippet di codice mostra come la tua app può avviare un flusso di accesso interattivo:private void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }
Nel callback
onActivityResult()
, gestisci il risultato dell'intent restituito.- Se l'accesso è riuscito, recupera l'oggetto
GoogleSignInAccount
daGoogleSignInResult
. - Se l'accesso non è andato a buon fine, devi gestire l'errore di accesso (ad esempio, visualizzando un messaggio di errore in un avviso). Il seguente snippet di codice mostra come la tua app può gestire i risultati dell'accesso del giocatore:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { // The signed in account is stored in the result. GoogleSignInAccount signedInAccount = result.getSignInAccount(); } else { String message = result.getStatus().getStatusMessage(); if (message == null || message.isEmpty()) { message = getString(R.string.signin_other_error); } new AlertDialog.Builder(this).setMessage(message) .setNeutralButton(android.R.string.ok, null).show(); } } }
- Se l'accesso è riuscito, recupera l'oggetto
Recuperare le informazioni del giocatore
Il GoogleSignInAccount
restituito dall'API Accedi con Google non contiene informazioni sul giocatore. Se il tuo gioco utilizza informazioni sui giocatori, come il nome visualizzato e l'ID giocatore,
puoi seguire questi passaggi per recuperarle.
- Ottieni un oggetto
PlayersClient
chiamando il metodogetPlayersClient()
e passandoGoogleSignInAccount
come parametro. - Utilizza i metodi
PlayersClient
per caricare in modo asincrono l'oggettoPlayer
che contiene le informazioni di un giocatore. Ad esempio, puoi chiamaregetCurrentPlayer()
per caricare il giocatore attualmente connesso. Se l'attività restituisce unApiException
con codice di statoSIGN_IN_REQUIRED
, ciò indica che il giocatore deve essere riautenticato. Per farlo, chiamaGoogleSignInClient.getSignInIntent()
per accedere al player in modo interattivo. - Se l'attività restituisce correttamente l'oggetto
Player
, puoi chiamare i metodi dell'oggettoPlayer
per recuperare i dettagli specifici del giocatore (ad esempio,getDisplayName()
ogetPlayerId()
).
Fornire un pulsante di accesso
Per fornire un pulsante di accesso Google standard nel tuo gioco, puoi utilizzare uno di questi approcci:
- Includi un
com.google.android.gms.common.SignInButton
nel layout dell'attività principale; oppure - Progetta un pulsante di accesso personalizzato in base alle linee guida per il branding di Accedi con Google.
Quando gli utenti fanno clic sul pulsante di accesso, il gioco deve avviare il flusso di accesso inviando un intent di accesso, come descritto in Eseguire un accesso interattivo.
Questo snippet di codice mostra come aggiungere un pulsante di accesso nel metodo onCreate()
per la tua attività.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_in); findViewById(R.id.sign_in_button).setOnClickListener(this); findViewById(R.id.sign_out_button).setOnClickListener(this); }
Lo snippet di codice riportato di seguito mostra come inviare l'intent di accesso quando l'utente fa clic sul pulsante di accesso.
@Override public void onClick(View view) { if (view.getId() == R.id.sign_in_button) { // start the asynchronous sign in flow startSignInIntent(); } else if (view.getId() == R.id.sign_out_button) { // sign out. signOut(); // show sign-in button, hide the sign-out button findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); findViewById(R.id.sign_out_button).setVisibility(View.GONE); } }
Visualizzare i popup di gioco
Puoi visualizzare le visualizzazioni popup nel tuo gioco utilizzando la classe GamesClient
. Ad esempio, il gioco
può mostrare un popup "Bentornato" o "Obiettivi sbloccati". Per consentire ai servizi per i giochi di Google Play
di avviare popup nelle visualizzazioni del tuo gioco, chiama il metodo
setViewForPopups()
. Puoi personalizzare ulteriormente la posizione in cui viene visualizzato il popup sullo schermo chiamando
setGravityForPopups()
.
Disconnetti il giocatore
La disconnessione viene eseguita chiamando il metodo signOut()
su GoogleSignInClient
.
private void signOut() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); signInClient.signOut().addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { // at this point, the user is signed out. } }); }