Po wycofaniu interfejsu Google Sign-In
API w 2026 roku usuniemy pakiet SDK do gier w wersji 1. Z końcem lutego 2025 r. nie będzie już można publikować w Google Play nowych tytułów, w których zastosowano integrację z wersją 1 pakietu SDK gier. Zamiast tego zalecamy używanie pakietu SDK do gier w wersji 2.
Dotychczasowe tytuły z integracjami gier w wersji 1 będą działać jeszcze przez kilka lat, ale zachęcamy do przejścia na wersję 2 od czerwca 2025 r.
Ten przewodnik dotyczy korzystania z pakietu SDK usług gier Play w wersji 1. Informacje o najnowszej wersji pakietu SDK znajdziesz w dokumentacji wersji 2.
Aby uzyskać dostęp do funkcji usług gier Play, gra musi udostępniać konto zalogowanego gracza. Jeśli gracz nie zostanie uwierzytelniony, podczas wywoływania interfejsów Google Play Games Services API w Twojej grze mogą wystąpić błędy. Z tego dokumentu dowiesz się, jak wdrożyć w grze bezproblemowe logowanie.
Wdrażanie logowania gracza
Klasa GoogleSignInClient
jest głównym punktem wejścia do pobierania konta aktualnie zalogowanego gracza i logowania gracza, jeśli nie zrobił tego wcześniej w Twojej aplikacji na urządzeniu.
Aby utworzyć klienta logowania, wykonaj te czynności:
Utwórz klienta logowania za pomocą obiektu
GoogleSignInOptions
, jak pokazano w tym fragmencie kodu. Aby skonfigurować logowanie w sekcjiGoogleSignInOptions.Builder
, musisz podaćGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
.GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
Jeśli chcesz użyć elementu
SnapshotsClient
, dodaj.requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
do elementuGoogleSignInOptions.Builder
, jak pokazano w tym fragmencie kodu:GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) .build();
Wywołaj metodę
GoogleSignIn.getClient()
i przekaż opcje skonfigurowane w poprzednich krokach. Jeśli wywołanie się powiedzie, interfejs Google Sign-In API zwróci instancję obiektuGoogleSignInClient
.
Sprawdzanie, czy gracz jest już zalogowany
Możesz sprawdzić, czy konto jest już zalogowane na bieżącym urządzeniu, za pomocą funkcji GoogleSignIn.getLastSignedInAccount()
, a także czy ma już wymagane uprawnienia, za pomocą funkcji GoogleSignIn.hasPermissions()
.
Jeśli oba warunki są spełnione, czyli getLastSignedInAccount()
zwraca wartość inną niż null, a hasPermissions()
zwraca true
, możesz bezpiecznie używać konta zwróconego przez getLastSignedInAccount()
, nawet jeśli urządzenie jest offline.
Przeprowadzanie cichego logowania
Możesz wywołać funkcję silentSignIn()
, aby pobrać konto aktualnie zalogowanego gracza, i spróbować zalogować graczy bez wyświetlania interfejsu, jeśli zalogowali się już w Twojej aplikacji na innym urządzeniu.
Metoda silentSignIn()
zwraca wartość Task<GoogleSignInAccount>
. Po zakończeniu zadania ustaw pole GoogleSignInAccount
zadeklarowane wcześniej na konto logowania, które zadanie zwraca jako wynik, lub na null
, co oznacza, że nie ma zalogowanego użytkownika.
Jeśli próba cichego logowania się nie powiedzie, możesz opcjonalnie wysłać intencję logowania, aby wyświetlić interfejs logowania, zgodnie z opisem w sekcji Przeprowadzanie interaktywnego logowania.
Stan zalogowanego gracza może się zmienić, gdy aktywność nie jest na pierwszym planie, dlatego zalecamy wywoływanie metody silentSignIn()
z metody onResume()
aktywności.
Aby zalogować się w trybie cichym, wykonaj te czynności:
- Wywołaj metodę
silentSignIn()
na obiekcieGoogleSignInClient
, aby rozpocząć proces cichego logowania. To wywołanie zwraca obiektTask<GoogleSignInAccount>
, który zawieraGoogleSignInAccount
, jeśli logowanie ciche zakończy się powodzeniem. - Obsłuż powodzenie lub niepowodzenie logowania gracza, zastępując funkcję
OnCompleteListener
.- Jeśli logowanie się powiodło, pobierz obiekt
GoogleSignInAccount
, wywołującgetResult()
. - Jeśli logowanie się nie powiodło, możesz wysłać intencję logowania, aby uruchomić interaktywny proces logowania.
Listę dodatkowych odbiorników wywołań zwrotnych, których możesz używać, znajdziesz w przewodniku dla deweloperów interfejsu Tasks API i
Task
w przewodniku po interfejsie API.
- Jeśli logowanie się powiodło, pobierz obiekt
Ten fragment kodu pokazuje, jak aplikacja może przeprowadzić ciche logowanie:
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(); }
Jeśli próba cichego logowania się nie powiedzie, możesz wywołać funkcję
getException()
, aby uzyskać ApiException
ze szczegółowym kodem stanu. Kod stanu CommonStatusCodes.SIGN_IN_REQUIRED
oznacza, że gracz musi podjąć wyraźne działanie, aby się zalogować. W takim przypadku aplikacja powinna uruchomić interaktywny proces logowania opisany w następnej sekcji.
Przeprowadzanie interaktywnego logowania
Aby zalogować się za pomocą interakcji z graczem, aplikacja musi uruchomić intencję logowania. Jeśli się to uda, interfejs Google Sign-In API wyświetli interfejs, w którym gracz będzie mógł wpisać dane logowania. Takie podejście upraszcza proces tworzenia aplikacji, ponieważ aktywność logowania obsługuje w Twoim imieniu scenariusze takie jak konieczność zaktualizowania Usług Google Play czy wyświetlanie próśb o zgodę. Wynik jest zwracany za pomocą wywołania zwrotnego onActivityResult
.
Aby zalogować się interaktywnie, wykonaj te czynności:
Wywołaj
getSigninIntent()
wGoogleSignInClient
, aby uzyskać intencję logowania, a następnie wywołajstartActivity()
i przekaż tę intencję. Poniższy fragment kodu pokazuje, jak aplikacja może uruchomić interaktywny proces logowania:private void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }
W wywołaniu zwrotnym
onActivityResult()
obsłuż wynik zwróconej intencji.- Jeśli logowanie się powiodło, pobierz obiekt
GoogleSignInAccount
zGoogleSignInResult
. - Jeśli logowanie się nie powiedzie, musisz obsłużyć błąd logowania (np. wyświetlić komunikat o błędzie w alercie). Ten fragment kodu pokazuje, jak aplikacja może obsługiwać wyniki logowania gracza:
@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(); } } }
- Jeśli logowanie się powiodło, pobierz obiekt
Pobieranie informacji o odtwarzaczu
GoogleSignInAccount
zwracany przez interfejs Google Sign-In API nie zawiera żadnych informacji o graczu. Jeśli Twoja gra korzysta z informacji o graczu, takich jak nazwa wyświetlana i identyfikator gracza, możesz wykonać te czynności, aby je pobrać.
- Uzyskaj obiekt
PlayersClient
, wywołując metodęgetPlayersClient()
i przekazującGoogleSignInAccount
jako parametr. - Użyj metod
PlayersClient
, aby asynchronicznie wczytać obiektPlayer
, który zawiera informacje o graczu. Możesz na przykład wywołaćgetCurrentPlayer()
, aby wczytać aktualnie zalogowanego gracza. Jeśli zadanie zwracaApiException
z kodem stanuSIGN_IN_REQUIRED
, oznacza to, że gracz musi ponownie przejść proces uwierzytelniania. Aby to zrobić, wywołaj funkcjęGoogleSignInClient.getSignInIntent()
w celu interaktywnego zalogowania się w odtwarzaczu. - Jeśli zadanie zwróci obiekt
Player
, możesz wywołać metody obiektuPlayer
, aby pobrać szczegółowe informacje o graczu (np.getDisplayName()
lubgetPlayerId()
).
Umieść przycisk logowania
Aby udostępnić w grze standardowy przycisk logowania przez Google, możesz zastosować jedno z tych rozwiązań:
- Dodaj element
com.google.android.gms.common.SignInButton
do układu głównej aktywności lub - Zaprojektuj niestandardowy przycisk logowania zgodnie z wytycznymi dotyczącymi marki Logowanie przez Google.
Gdy użytkownicy klikną przycisk logowania, gra powinna zainicjować proces logowania, wysyłając intencję logowania zgodnie z opisem w sekcji Przeprowadzanie interaktywnego logowania.
Ten fragment kodu pokazuje, jak dodać przycisk logowania w metodzie onCreate()
aktywności.
@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); }
Ten fragment kodu pokazuje, jak wysłać intencję logowania, gdy użytkownik kliknie przycisk logowania.
@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); } }
Wyświetlanie wyskakujących okienek w grach
W grze możesz wyświetlać widoki wyskakujące za pomocą klasy GamesClient
. Na przykład gra może wyświetlać wyskakujące okienko „Witamy z powrotem” lub „Osiągnięcia odblokowane”. Aby zezwolić usługom gier Google Play na wyświetlanie wyskakujących okien w widokach w grze, wywołaj metodę setViewForPopups()
. Możesz dodatkowo dostosować miejsce wyświetlania wyskakującego okienka na ekranie, wywołując funkcję setGravityForPopups()
.
Wylogowywanie gracza
Wylogowanie następuje przez wywołanie metody signOut()
w obiekcie 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. } }); }