Android Games'te oturum aç

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

Oyuncu olarak oturum açma

GoogleSignInClient sınıfı, o anda oturum açmış olan oyuncunun hesabını almak ve cihazda daha önce uygulama içinde oturum açmamışsa oturum 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 sayfasında GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN değerini belirtmeniz gerekir.

    GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  2. Bir SnapshotsClient kullanmak isterseniz aşağıdaki kod snippet'inde gösterildiği gibi GoogleSignInOptions.Builder içine .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. Arama başarılı olursa Google ile Oturum Açma API'si GoogleSignInClient örneğini döndürür.

Oyuncunun zaten oturum açmış olup olmadığını kontrol etme

GoogleSignIn.getLastSignedInAccount() hesabını kullanarak mevcut cihazda oturum açıp açmadığınızı ve bu hesapta GoogleSignIn.hasPermissions() kullanarak verilen gerekli izinlere sahip olup olmadığını kontrol edebilirsiniz. İki koşul da doğruysa (yani getLastSignedInAccount(), null olmayan bir değer döndürürse ve hasPermissions() işlevi true değerini döndürürse cihaz çevrimdışı olsa bile getLastSignedInAccount() öğesinden döndürülen hesabı güvenli bir şekilde kullanabilirsiniz.

Sessiz oturum açma işlemi gerçekleştirme

Şu anda oturum açmış olan oyuncunun hesabını almak için silentSignIn() numaralı telefonu arayabilir ve farklı bir cihazda uygulamanızda başarıyla oturum açmış oyuncuları kullanıcı arayüzü göstermeden oturum açmaya çalışabilirsiniz.

silentSignIn() yöntemi Task<GoogleSignInAccount> değerini döndürür. Görev tamamlandığında daha önce belirttiğ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 değerine ayarlarsınız.

Sessiz oturum açma denemesi başarısız olursa isteğe bağlı olarak Etkileşimli oturum açma bölümünde açıklandığı gibi bir oturum açma kullanıcı arayüzü görüntülemek için oturum açma amacını gönderebilirsiniz.

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

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

  1. Sessiz oturum açma akışını başlatmak için GoogleSignInClient üzerindeki silentSignIn() yöntemini çağırın. Bu çağrı, sessiz oturum açma başarılı olursa GoogleSignInAccount içeren bir Task<GoogleSignInAccount> nesnesi döndürür.
  2. OnCompleteListener ayarını geçersiz kılarak oyuncu oturumu açma işleminin başarılı veya başarısız olmasını sağlayın.
    • Oturum açma görevi başarılı olduysa getResult() yöntemini çağırarak GoogleSignInAccount nesnesini alın.
    • Oturum açma başarılı olmadıysa etkileşimli bir oturum açma akışı başlatmak için oturum açma amacı gönderebilirsiniz. Kullanabileceğiniz diğer geri çağırma dinleyicilerinin listesi için Tasks API geliştirici kılavuzunu ve Task API referansını inceleyin.

Aşağıdaki kod snippet'i, uygulamanızın sessiz oturum açma performansını nasıl gösterebileceğini gösterir:

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 girişimi başarısız olursa ayrıntılı durum koduyla bir ApiException edinmek için getException() yöntemini çağırabilirsiniz. Durum kodu CommonStatusCodes.SIGN_IN_REQUIRED, oyuncunun oturum açmak için açıkça işlem yapması gerektiğini gösterir. Bu durumda, uygulamanız bir 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 amacını başlatması gerekir. İşlem başarılı olursa Google Oturum Açma API'sı, oyuncudan oturum açmak için kimlik bilgilerini girmesini isteyen bir kullanıcı arayüzü görüntüler. Oturum açma etkinliği, uygulamanızın adına Google Play hizmetlerini güncelleme veya izin istemleri gösterme gibi senaryoları işlemesi sayesinde bu yaklaşım, uygulama geliştirme sürecinizi basitleştirir. Sonuç, onActivityResult geri çağırması aracılığıyla 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 amacı almak için GoogleSignInClient alanındaki getSigninIntent() numaralı telefonu arayın, ardından startActivity() numaralı telefonu arayıp bu amacı iletin. Aşağıdaki kod snippet'i, uygulamanızın etkileşimli bir oturum açma akışını nasıl başlatabileceğini gösterir:

    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ğırmasında, döndürülen amaçtaki sonucu işleyin.

    • Oturum açma başarılı olduysa GoogleSignInResult üzerinden 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'i, uygulamanızın oyuncu oturum açma sonuçlarını nasıl işleyebileceğini gösterir:
    @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 ile Oturum Açma API'sının döndürdüğü GoogleSignInAccount herhangi bir oyuncu bilgisi içermiyor. Oyununuz, oyuncunun görünen adı ve oyuncu kimliği gibi oyuncu bilgilerini kullanıyorsa bu bilgileri almak için aşağıdaki adımları uygulayabilirsiniz.

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

Oturum açma düğmesi sağlama

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 amacı göndererek oturum açma akışını başlatmalıdır.

Bu kod snippet'i, etkinliğiniz için onCreate() yöntemine 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'i, kullanıcı oturum açma düğmesini tıkladığında oturum açma amacını nasıl gönderebileceğinizi gösterir.

@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österiliyor

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

Oyuncu oturumu kapatılıyor

Oturumu GoogleSignInClient içindeki signOut() yöntemini kullanarak çağırabilirsiniz.

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