Logowanie się w grach na Androida

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:

  1. Utwórz klienta logowania za pomocą obiektu GoogleSignInOptions, jak pokazano w tym fragmencie kodu. Aby skonfigurować logowanie w sekcji GoogleSignInOptions.Builder, musisz podać GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN.

    GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  2. Jeśli chcesz użyć elementu SnapshotsClient, dodaj .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) do elementu GoogleSignInOptions.Builder, jak pokazano w tym fragmencie kodu:

    GoogleSignInOptions  signInOptions =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
            .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
            .build();
  3. 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ę obiektu GoogleSignInClient.

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:

  1. Wywołaj metodę silentSignIn() na obiekcie GoogleSignInClient, aby rozpocząć proces cichego logowania. To wywołanie zwraca obiekt Task<GoogleSignInAccount>, który zawiera GoogleSignInAccount, jeśli logowanie ciche zakończy się powodzeniem.
  2. Obsłuż powodzenie lub niepowodzenie logowania gracza, zastępując funkcję OnCompleteListener.

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:

  1. Wywołaj getSigninIntent()GoogleSignInClient, aby uzyskać intencję logowania, a następnie wywołaj startActivity() 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);
    }
  2. W wywołaniu zwrotnym onActivityResult() obsłuż wynik zwróconej intencji.

    • Jeśli logowanie się powiodło, pobierz obiekt GoogleSignInAccountGoogleSignInResult.
    • 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();
        }
      }
    }

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ć.

  1. Uzyskaj obiekt PlayersClient, wywołując metodę getPlayersClient() i przekazując GoogleSignInAccount jako parametr.
  2. Użyj metod PlayersClient, aby asynchronicznie wczytać obiekt Player, który zawiera informacje o graczu. Możesz na przykład wywołać getCurrentPlayer(), aby wczytać aktualnie zalogowanego gracza. Jeśli zadanie zwraca ApiException z kodem stanu SIGN_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.
  3. Jeśli zadanie zwróci obiekt Player, możesz wywołać metody obiektu Player, aby pobrać szczegółowe informacje o graczu (np. getDisplayName() lub getPlayerId()).

Umieść przycisk logowania

Aby udostępnić w grze standardowy przycisk logowania przez Google, możesz zastosować jedno z tych rozwiązań:

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.
        }
      });
}