Android Games'de oturum aç

Google ile Giriş API'sinin desteğinin sonlandırılmasının ardından, 2026'da Games v1 SDK'sını kaldırıyoruz. Şubat 2025'ten sonra games v1 SDK'sıyla yeni entegre edilen oyunları Google Play'de yayınlayamayacaksınız. Bunun yerine games v2 SDK'sını kullanmanızı öneririz.
Önceki Games v1 entegrasyonlarına sahip mevcut uygulamalar birkaç yıl daha çalışmaya devam edecek olsa da Haziran 2025'ten itibaren v2'ye geçiş yapmanız önerilir.
Bu kılavuz, Play Games Hizmetleri v1 SDK'sının kullanımıyla ilgilidir. En son SDK sürümü hakkında bilgi için v2 belgelerine bakın.

Google Play Games Hizmetleri işlevlerine erişmek için oyununuzun, oturum açmış oyuncunun hesabını sağlaması gerekir. Oyuncu kimliği doğrulanmamışsa oyununuz, Google Play Games Hizmetleri API'lerine çağrı yaparken hatalarla karşılaşabilir. Bu belgede, oyununuzda sorunsuz bir oturum açma deneyiminin nasıl uygulanacağı açıklanmaktadır.

Oyuncu oturum açma özelliğini uygulama

GoogleSignInClient sınıfı, şu anda oturum açmış oyuncunun hesabını almak ve daha önce cihazda uygulamanızda oturum açmamışsa oyuncunun oturumunu açmak için kullanılan ana giriş noktasıdır.

Oturum açma istemcisi oluşturmak için aşağıdaki adımları uygulayın:

  1. Aşağıdaki kod snippet'inde gösterildiği gibi, GoogleSignInOptions nesnesi aracılığıyla bir oturum açma istemcisi oluşturun. Oturum açma işleminizi yapılandırmak için GoogleSignInOptions.Builder bölümünde GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN belirtmeniz gerekir.

    GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  2. SnapshotsClient kullanmak istiyorsanız aşağıdaki kod snippet'inde gösterildiği gibi .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) öğesini GoogleSignInOptions.Builder öğenize ekleyin:

    GoogleSignInOptions  signInOptions =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
            .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
            .build();
  3. GoogleSignIn.getClient() yöntemini çağırın ve önceki adımlarda yapılandırdığınız seçenekleri iletin. Çağrı başarılı olursa Google ile Giriş API'si, GoogleSignInClient örneğini döndürür.

Oynatıcının oturumunun zaten açık olup olmadığını kontrol etme

GoogleSignIn.getLastSignedInAccount() kullanarak mevcut cihazda bir hesabın oturumunun zaten açık olup olmadığını, GoogleSignIn.hasPermissions() kullanarak da bu hesabın gerekli izinlere sahip olup olmadığını kontrol edebilirsiniz. Her iki koşul da doğruysa (yani getLastSignedInAccount() boş olmayan bir değer döndürüyorsa ve hasPermissions() true değerini döndürüyorsa) cihaz çevrimdışı olsa bile getLastSignedInAccount() tarafından döndürülen hesabı güvenle kullanabilirsiniz.

Sessiz oturum açma gerçekleştirme

Şu anda oturum açmış oyuncunun hesabını almak için silentSignIn() numaralı telefonu arayabilir, ve farklı bir cihazda uygulamanızda başarılı bir şekilde oturum açmışlarsa kullanıcı arayüzü göstermeden oyuncuların oturum açmasını sağlayabilirsiniz.

silentSignIn() yöntemi Task<GoogleSignInAccount> döndürür. Görev tamamlandığında, daha önce bildirdiğiniz GoogleSignInAccount alanını, görevin sonuç olarak döndürdüğü oturum açma hesabına veya oturum açmış bir kullanıcı olmadığını belirten null olarak ayarlarsınız.

Sessiz oturum açma girişimi başarısız olursa isteğe bağlı olarak oturum açma kullanıcı arayüzünü göstermek için oturum açma amacını gönderebilirsiniz. Bu işlem, Etkileşimli oturum açma gerçekleştirme bölümünde açıklanmıştır.

Etkinlik ön planda olmadığında oturum açmış oyuncunun durumu değişebileceğinden, silentSignIn() yönteminin etkinlikten onResume() olarak çağrılması önerilir.

Oturum açma işlemini sessizce gerçekleştirmek için aşağıdaki adımları uygulayın:

  1. Sessiz oturum açma akışını başlatmak için GoogleSignInClient üzerinde silentSignIn() yöntemini çağırın. Bu çağrı, sessiz oturum açma işlemi başarılı olursa GoogleSignInAccount içeren bir Task<GoogleSignInAccount> nesnesi döndürür.
  2. OnCompleteListener işlevini geçersiz kılarak oyuncu oturum açma işleminin başarılı veya başarısız olmasını yönetin.
    • Oturum açma görevi başarılı olduysa getResult() işlevini çağırarak GoogleSignInAccount nesnesini alın.
    • Oturum açma işlemi başarılı olmazsa etkileşimli bir oturum açma akışı başlatmak için oturum açma amaçlı bir istek gönderebilirsiniz. Kullanabileceğiniz ek geri çağırma işleyicilerinin listesi için Tasks API geliştirici kılavuzuna ve Task API referansına bakın.

Aşağıdaki kod snippet'inde, uygulamanızın nasıl sessizce oturum açabileceği gösterilmektedir:

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

Sessiz oturum açma denemesi başarısız olursa ayrıntılı durum koduyla birlikte ApiException almak için getException() işlevini çağırabilirsiniz. CommonStatusCodes.SIGN_IN_REQUIRED durum kodu, oynatıcının oturum açmak için açıkça işlem yapması gerektiğini gösterir. Bu durumda uygulamanız, sonraki bölümde açıklandığı gibi etkileşimli bir oturum açma akışı başlatmalıdır.

Etkileşimli oturum açma işlemi gerçekleştirme

Oyuncu etkileşimiyle oturum açmak için uygulamanızın oturum açma amacını başlatması gerekir. İşlem başarılı olursa Google ile Oturum Açma API'si, oyuncudan oturum açmak için kimlik bilgilerini girmesini isteyen bir kullanıcı arayüzü gösterir. Bu yaklaşım, uygulamanız adına Google Play Hizmetleri'nin güncellenmesi veya izin istemlerinin gösterilmesi gibi senaryoları oturum açma etkinliği işlediğinden uygulama geliştirme sürecinizi basitleştirir. Sonuç, onActivityResult geri çağırma işleviyle döndürülür.

Oturum açma işlemini etkileşimli olarak gerçekleştirmek için aşağıdaki adımları uygulayın:

  1. Oturum açma niyeti elde etmek için getSigninIntent() işlevini GoogleSignInClient üzerinde çağırın, ardından startActivity() işlevini çağırıp bu niyeti iletin. Aşağıdaki kod snippet'inde, uygulamanızın nasıl etkileşimli bir oturum açma akışı başlatabileceği gösterilmektedir:

    private void startSignInIntent() {
      GoogleSignInClient signInClient = GoogleSignIn.getClient(this,
          GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
      Intent intent = signInClient.getSignInIntent();
      startActivityForResult(intent, RC_SIGN_IN);
    }
  2. onActivityResult() geri aramasında döndürülen amaçtan gelen sonucu işleyin.

    • Oturum açma işlemi başarılı olduysa GoogleSignInResult öğesinden GoogleSignInAccount nesnesini alın.
    • Oturum açma işlemi başarılı olmazsa oturum açma hatasını (ör. uyarıda hata mesajı göstererek) ele almanız gerekir. Aşağıdaki kod snippet'inde, uygulamanızın oyuncu oturum açma sonuçlarını nasıl işleyebileceği gösterilmektedir:
    @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();
        }
      }
    }

Oynatıcı bilgilerini alma

Google ile Oturum Açma API'sinin döndürdüğü GoogleSignInAccount, oyuncu bilgisi içermez. Oyununuzda oyuncunun görünen adı ve oyuncu kimliği gibi oyuncu bilgileri kullanılıyorsa bu bilgileri almak için aşağıdaki adımları uygulayabilirsiniz.

  1. getPlayersClient() yöntemini çağırıp GoogleSignInAccount değerini parametre olarak ileterek PlayersClient nesnesi edinin.
  2. Oyuncunun bilgilerini içeren Player nesnesini eşzamansız olarak yüklemek için PlayersClient yöntemlerini kullanın. Örneğin, şu anda oturum açmış olan oyuncuyu yüklemek için getCurrentPlayer() işlevini çağırabilirsiniz. Görev, durum kodu SIGN_IN_REQUIRED olan bir ApiException döndürürse oyuncunun yeniden kimlik doğrulaması yapması gerekir. Bunu yapmak için GoogleSignInClient.getSignInIntent() numaralı telefonu arayarak oynatıcıda etkileşimli olarak oturum açın.
  3. Görev, Player nesnesini başarıyla döndürürse belirli oyuncu ayrıntılarını (örneğin, getDisplayName() veya getPlayerId()) almak için Player nesnesinin yöntemlerini çağırabilirsiniz.

Oturum açma düğmesi ekleyin

Oyununuzda standart bir Google ile oturum açma düğmesi sağlamak için aşağıdaki yaklaşımlardan birini kullanabilirsiniz:

Kullanıcılar oturum açma düğmesini tıkladığında oyununuz, Etkileşimli oturum açma gerçekleştirme bölümünde açıklandığı gibi bir oturum açma amaçlı isteği göndererek oturum açma akışını başlatmalıdır.

Bu kod snippet'i, etkinliğiniz için onCreate() yönteminde nasıl oturum açma düğmesi ekleyebileceğinizi gösterir.

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

Aşağıdaki kod snippet'inde, kullanıcı oturum açma düğmesini tıkladığında oturum açma niyetini nasıl gönderebileceğiniz gösterilmektedir.

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

Oyun pop-up'larını gösterme

GamesClient sınıfını kullanarak oyununuzda pop-up görünümler gösterebilirsiniz. Örneğin, oyununuzda "Tekrar hoş geldiniz" veya "Başarıların kilidi açıldı" pop-up'ı gösterilebilir. Google Play Oyun Hizmetleri'nin oyununuzdaki görünümlerde pop-up'lar başlatmasına izin vermek için setViewForPopups() yöntemini çağırın. setGravityForPopups() yöntemini çağırarak pop-up'ın ekranda görüneceği yeri daha da özelleştirebilirsiniz.

Oynatıcının oturumunu kapatma

Oturum kapatma işlemi, GoogleSignInClient üzerinde signOut() yöntemi çağrılarak yapılır.

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