Login di Game Android

Untuk mengakses fungsi layanan game Google Play, game Anda harus menyediakan akun pemain yang login. Jika pemain tidak diautentikasi, game Anda mungkin mengalami error saat melakukan panggilan ke API layanan game Google Play. Dokumentasi ini menjelaskan cara menerapkan pengalaman login yang lancar di game Anda.

Menerapkan login pemain

Class GoogleSignInClient adalah titik entri utama untuk mengambil akun class saat ini untuk membuat pemain login, dan membuat pemain login jika belum pernah melakukannya pada aplikasi Anda di perangkat seluler.

Untuk membuat klien login, ikuti langkah-langkah berikut:

  1. Buat klien login melalui GoogleSignInOptions seperti yang ditunjukkan dalam cuplikan kode berikut. Di kolom GoogleSignInOptions.Builder untuk mengonfigurasi login, Anda harus menentukan GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN.

    GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  2. Jika Anda ingin menggunakan SnapshotsClient, lalu tambahkan .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) ke GoogleSignInOptions.Builder seperti yang ditunjukkan dalam cuplikan kode berikut:

    GoogleSignInOptions  signInOptions =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
            .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
            .build();
  3. Panggil metode GoogleSignIn.getClient() dan teruskan opsi yang Anda konfigurasi pada langkah sebelumnya. Jika panggilan adalah berhasil, Google Sign-In API mengembalikan instance GoogleSignInClient

Memeriksa apakah pemain sudah login atau belum

Anda dapat memeriksa apakah akun sudah login di perangkat saat ini menggunakan GoogleSignIn.getLastSignedInAccount() dan apakah akun ini sudah memiliki izin yang diperlukan yang diberikan menggunakan GoogleSignIn.hasPermissions(). Jika kedua kondisi benar—yaitu, getLastSignedInAccount() akan menampilkan nilai bukan null dan hasPermissions() menampilkan true—Anda dapat menggunakan akun yang ditampilkan dari getLastSignedInAccount(), meskipun perangkat secara offline.

Melakukan login otomatis

Anda dapat memanggil silentSignIn() untuk mengambil akun pemain yang saat ini login. dan coba membuat pemain masuk tanpa menampilkan antarmuka pengguna jika mereka berhasil login ke aplikasi Anda di perangkat lain.

Metode silentSignIn() akan menampilkan Task<GoogleSignInAccount>. Saat tugas itu selesai, Anda menyetel kolom GoogleSignInAccount yang Anda deklarasikan sebelumnya ke akun login bahwa tugas ditampilkan sebagai hasil, atau ke null, yang menunjukkan bahwa tidak ada pengguna yang login.

Jika upaya login otomatis gagal, Anda dapat mengirim intent login untuk menampilkan antarmuka pengguna login, seperti yang dijelaskan dalam Melakukan login interaktif.

Karena status pemain yang login dapat berubah ketika aktivitas tidak ada di latar depan, kita disarankan untuk memanggil silentSignIn() dari metode onResume() .

Untuk login secara otomatis, ikuti langkah-langkah berikut:

  1. Panggil metode silentSignIn() di GoogleSignInClient untuk memulai alur login senyap. Panggilan ini menampilkan objek Task<GoogleSignInAccount> yang berisi GoogleSignInAccount jika login otomatis berhasil.
  2. Tangani keberhasilan atau kegagalan login pemain dengan mengganti OnCompleteListener
    • Jika tugas login berhasil, dapatkan GoogleSignInAccount dengan memanggil getResult().
    • Jika login tidak berhasil, Anda dapat mengirim intent login untuk meluncurkan alur login interaktif. Untuk mengetahui daftar pemroses callback tambahan yang bisa Anda gunakan, lihat metode Panduan developer Tasks API dan Task Referensi API.

Cuplikan kode berikut menunjukkan cara aplikasi Anda melakukan login secara otomatis:

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

Jika upaya login otomatis gagal, Anda dapat memanggil getException() ke dapatkan ApiException dengan kode status mendetail. Kode status CommonStatusCodes.SIGN_IN_REQUIRED menunjukkan bahwa pemutar perlu melakukan tindakan eksplisit untuk login. Dalam hal ini, aplikasi Anda harus meluncurkan alur login interaktif seperti yang dijelaskan di bagian berikutnya.

Menjalankan login interaktif

Untuk login dengan interaksi pemain, aplikasi Anda harus meluncurkan intent login. Jika berhasil, Google Sign-In API menampilkan antarmuka pengguna yang meminta pemain memasukkan kredensialnya untuk login. Pendekatan ini menyederhanakan pengembangan aplikasi, karena aktivitas login menangani skenario seperti perlu mengupdate layanan Google Play atau menampilkan perintah izin, di halaman nama Anda. Hasilnya ditampilkan melalui onActivityResult .

Untuk melakukan login secara interaktif, ikuti langkah-langkah berikut:

  1. Panggil getSigninIntent() di GoogleSignInClient untuk mendapatkan intent login, lalu panggil startActivity() dan meneruskan intent tersebut. Cuplikan kode berikut menunjukkan cara aplikasi Anda dapat meluncurkan alur login interaktif:

    private void startSignInIntent() {
      GoogleSignInClient signInClient = GoogleSignIn.getClient(this,
          GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
      Intent intent = signInClient.getSignInIntent();
      startActivityForResult(intent, RC_SIGN_IN);
    }
  2. Di onActivityResult() , menangani hasil dari intent yang ditampilkan.

    • Jika hasil login berhasil, dapatkan Objek GoogleSignInAccount dari GoogleSignInResult.
    • Jika hasil login tidak berhasil, Anda harus menangani error login (misalnya, dengan menampilkan pesan error dalam pemberitahuan). Cuplikan kode berikut menunjukkan cara aplikasi Anda menangani hasil login pemain:
    @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();
        }
      }
    }

Mengambil informasi pemain

GoogleSignInAccount yang ditampilkan oleh Google Sign-In API tidak berisi pemutar apa pun tidak akurat atau tidak sesuai. Jika game Anda menggunakan informasi pemain, seperti nama tampilan pemain dan ID pemain, Anda dapat mengikuti langkah-langkah berikut untuk mengambil informasi ini.

  1. Dapatkan objek PlayersClient dengan memanggil metode getPlayersClient(), dan meneruskan GoogleSignInAccount sebagai parameter.
  2. Gunakan metode PlayersClient untuk memuat Player secara asinkron yang berisi informasi pemain. Misalnya, Anda dapat memanggil getCurrentPlayer() untuk memuat pemutar yang saat ini login. Jika tugas mengembalikan ApiException dengan kode status dari SIGN_IN_REQUIRED, menunjukkan bahwa pemain harus diautentikasi ulang. Untuk melakukannya, panggil GoogleSignInClient.getSignInIntent() untuk membuat pemain login secara interaktif.
  3. Jika tugas berhasil menampilkan objek Player, Anda dapat memanggil metode Objek Player untuk mengambil detail pemain tertentu (misalnya, getDisplayName() atau getPlayerId().

Menyediakan tombol login

Untuk menyediakan tombol login dengan Google standar di game, Anda dapat menggunakan salah satu pendekatan-pendekatan ini:

Saat pengguna mengklik tombol login, game Anda harus memulai alur login dengan mengirimkan intent login, seperti yang dijelaskan dalam Melakukan login interaktif.

Cuplikan kode ini menunjukkan cara menambahkan tombol login di onCreate() untuk aktivitas Anda.

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

Cuplikan kode berikut menunjukkan cara mengirim intent login saat pengguna mengklik tombol login.

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

Menampilkan pop-up game

Anda dapat menampilkan tampilan pop-up dalam game menggunakan class GamesClient. Misalnya, game Anda dapat menampilkan pop-up “Selamat datang kembali” atau “Pencapaian terbuka”. Untuk mengizinkan layanan game Google Play untuk meluncurkan pop-up dalam tampilan di game Anda, panggil setViewForPopups() . Anda dapat menyesuaikan lebih lanjut tempat pop-up muncul di layar dengan memanggil setGravityForPopups()

Logout dari pemain

Logout dilakukan melalui panggilan metode signOut() di 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.
        }
      });
}