Android Games'de oturum aç

Google Play Games Hizmetleri işlevlerine erişmek için oyununuzun, oturum açmış oyuncunun hesabını sağlaması gerekir. Oyuncunun kimliği doğrulanmamışsa oyununuz Google Play Games Hizmetleri API'lerine çağrı yaparken hatalarla karşılaşabilir. Bu dokümanda, 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ış olan oyuncunun hesabını almak ve oyuncunun cihazdaki uygulamanızda daha önce 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 ayarlarınızı yapılandırmak için GoogleSignInOptions.Builder bölümünde GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN değerini belirtmeniz gerekir.

    GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  2. SnapshotsClient kullanmak istiyorsanız aşağıdaki kod snippet'inde gösterildiği gibi GoogleSignInOptions.Builder öğenize .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) 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 Oturum Açma API'si GoogleSignInClient örneği döndürür.

Kullanıcının oturum açıp açmadığını kontrol etme

GoogleSignIn.getLastSignedInAccount() kullanarak bir hesabın mevcut cihazda oturum açıp açmadığını ve GoogleSignIn.hasPermissions() kullanarak 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 döndürüyorsa) cihaz çevrimdışı olsa bile getLastSignedInAccount() tarafından döndürülen hesabı güvenle kullanabilirsiniz.

Sessiz oturum açma

Oturumu açık olan oyuncunun hesabını almak için silentSignIn() işlevini çağırabilir ve farklı bir cihazda uygulamanızda başarıyla oturum açmış olan oyuncuları kullanıcı arayüzü göstermeden oturum açmaya çalışabilirsiniz.

silentSignIn() yöntemi bir Task<GoogleSignInAccount> döndürür. Görev tamamlandığında, daha önce tanımladığınız 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 değerine 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ü göstermek için oturum açma intent'ini gönderebilirsiniz. Bu işlem Etkileşimli oturum açma işlemi gerçekleştirme bölümünde açıklanmaktadır.

Etkinlik ön planda değilken oturum açmış oynatıcının durumu değişebileceğinden, silentSignIn() yöntemini etkinliğin onResume() yönteminden çağırmanızı öneririz.

Sessiz oturum açma işlemini 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 değerini geçersiz kılarak oynatıcının oturum açmasının başarılı veya başarısız olup olmadığını yönetin.
    • Oturum açma görevi başarılıysa getResult() çağrısını yaparak GoogleSignInAccount nesnesini alın.
    • Oturum açma işlemi başarılı olmadıysa etkileşimli bir oturum açma akışı başlatmak için oturum açma isteği gönderebilirsiniz. Kullanabileceğiniz ek geri çağırma dinleyicilerinin 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 sessiz oturum açmayı nasıl gerçekleştirebileceğ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 kodu içeren bir ApiException almak için getException() numaralı telefonu arayabilirsiniz. CommonStatusCodes.SIGN_IN_REQUIRED durum kodu, oyuncunun oturum açmak için açık bir 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

Oyuncu etkileşimiyle oturum açmak için uygulamanızın oturum açma intent'ini başlatması gerekir. İşlem başarılı olursa Google Sign-In API, oyuncudan oturum açmak için kimlik bilgilerini girmesini isteyen bir kullanıcı arayüzü gösterir. Oturum açma etkinliği, Google Play Hizmetleri'nin güncellenmesi veya izin istemlerinin gösterilmesi gibi senaryoları uygulamanız adına ele aldığından bu yaklaşım, uygulama geliştirmenizi basitleştirir. Sonuç, onActivityResult geri çağırma işlevi aracılığıyla döndürülür.

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

  1. Oturum açma niyeti almak için GoogleSignInClient üzerinde getSigninIntent()'i çağırın, ardından startActivity()'i ç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 çağırma işlevinde, döndürülen intent'ten gelen sonucu işleyin.

    • Oturum açma sonucu başarılıysa GoogleSignInResult öğesinden GoogleSignInAccount nesnesini alın.
    • Oturum açma sonucu başarılı olmadıysa oturum açma hatasını ele almanız gerekir (örneğin, bir uyarıda hata mesajı görüntüleyerek). 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();
        }
      }
    }

Oyuncu bilgilerini alma

Google Sign-In API'nin döndürdüğü GoogleSignInAccount, herhangi bir oyuncu bilgisi içermez. Oyununuzda oyuncu bilgileri (ör. oyuncunun görünen adı ve oyuncu kimliği) kullanılıyorsa bu bilgileri almak için aşağıdaki adımları uygulayabilirsiniz.

  1. getPlayersClient() yöntemini çağırıp GoogleSignInAccount parametresi olarak göndererek bir PlayersClient nesnesi elde edin.
  2. Oyuncu 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 oynatıcıyı yüklemek için getCurrentPlayer() işlevini çağırabilirsiniz. Görev, SIGN_IN_REQUIRED durum koduna sahip bir ApiException döndürürse oyuncunun kimliğinin yeniden doğrulanması gerekir. Bunu yapmak için oynatıcıda etkileşimli olarak oturum açmak üzere GoogleSignInClient.getSignInIntent() düğmesini çağırın.
  3. Görev Player nesnesini başarıyla döndürürse belirli oyuncu ayrıntılarını (ör. getDisplayName() veya getPlayerId()) almak için Player nesnesinin yöntemlerini çağırabilirsiniz.

Oturum açma düğmesi ekleyin

Oyununuzda standart bir Google 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 bölümünde açıklandığı gibi bir oturum açma isteği göndererek oturum açma akışını başlatmalıdır.

Bu kod snippet'inde, etkinliğiniz için onCreate() yöntemine nasıl oturum açma düğmesi ekleyeceğiniz gösterilmektedir.

@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ı gösterme

GamesClient sınıfını kullanarak oyununuzda pop-up görüntüler gösterebilirsiniz. Örneğin, oyununuzda "Tekrar hoş geldiniz" veya "Başarılar 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 nerede görüneceğini daha da özelleştirebilirsiniz.

Oyuncuların oturumunu kapatma

Oturum kapatma işlemi, GoogleSignInClient üzerinde signOut() yönteminin çağrılmasıyla 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.
        }
      });
}