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
Taskw 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
GoogleSignInAccountzGoogleSignInResult. - 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ącGoogleSignInAccountjako 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 zwracaApiExceptionz 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.SignInButtondo 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. } }); }