Android ゲームにログインする

Google Play Games サービスの機能にアクセスするには、ゲームに 表示されます。プレーヤーが認証されていない場合、ゲームでエラーが発生することがあります。 Google Play Games サービス API の呼び出し時に。このドキュメントでは、ゲームにシームレスなログイン エクスペリエンスを実装する方法について説明します。

プレーヤーのログインの実装

GoogleSignInClient クラスは、現在のアカウントのアカウントを取得するためのメインのエントリ ポイントです。 ログインする必要があります。また、アプリでログインしたことがない場合は、 ダウンロードします

ログイン クライアントを作成する手順は次のとおりです。

  1. API を介してログイン クライアントを作成する GoogleSignInOptions オブジェクトを宣言します。 GoogleSignInOptions.Builder ログインを構成するには、 GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN

    GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  2. 「新規顧客の獲得」目標を SnapshotsClient 次に .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)GoogleSignInOptions.Builder これを次のコード スニペットに示します。

    GoogleSignInOptions  signInOptions =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
            .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
            .build();
  3. GoogleSignIn.getClient() メソッドを呼び出して、次を渡します。 前の手順で構成したオプションを確認します。もし 成功すると、Google Sign-In API は GoogleSignInClient

プレーヤーがすでにログインしているかどうかを確認する

アカウントがすでにログインしているかどうかを確認できます 現在のデバイスで GoogleSignIn.getLastSignedInAccount() を使用 と、このアカウントに必要な権限が付与されているかどうかを、 GoogleSignIn.hasPermissions()。 両方の条件が true(つまり、getLastSignedInAccount() が が null 以外の値を返し、hasPermissions()true を返す場合は、 getLastSignedInAccount() から返されたアカウント(デバイスが次の状態であっても) オフラインです。

サイレント ログインの実行

silentSignIn() を呼び出すと、現在ログインしているプレーヤーのアカウントを取得できます。 プレーヤーにユーザー インターフェースを表示せずにログインしてみる 別のデバイスでアプリにログインできました。

silentSignIn() メソッドは Task<GoogleSignInAccount> を返します。タスクが完了すると タスクを実行するログイン アカウントに、前に宣言した GoogleSignInAccount フィールドを設定します。 として返されます。または、ログインしているユーザーがいないことを示す null を返します。

サイレント ログインに失敗した場合、必要に応じてログイン インテントを送信して、 ユーザー インターフェースにログインできます。詳しくは、 インタラクティブ ログインの実行

アクティビティがフォアグラウンドでなければ、ログイン プレーヤーの状態が変化する可能性があるため、 アクティビティのクラスから silentSignIn() を呼び出すことをおすすめします。 onResume() メソッドを呼び出します。

サイレント ログインを行う手順は次のとおりです。

  1. GoogleSignInClientsilentSignIn() メソッドを呼び出して、サイレント ログインのフローを開始します。 この呼び出しは、次の場合に GoogleSignInAccount を含む Task<GoogleSignInAccount> オブジェクトを返します。 サイレント ログインが成功した場合です。
  2. プレーヤーのログインの成功または失敗を処理する OnCompleteListener
    • ログインタスクが成功したら、GoogleSignInAccount を取得します。 getResult() を呼び出してオブジェクトを作成します。
    • ログインに失敗した場合は、ログイン インテントを送信して、インタラクティブなログインフローを開始できます。 使用できるその他のコールバック リスナーのリストについては、 Tasks API デベロッパー ガイド および Task API リファレンス。

次のコード スニペットは、アプリでサイレント ログインを実行する方法を示しています。

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

サイレント ログインに失敗した場合は、 getException()ApiException を取得する 詳細なステータス コードが返されます。ステータス コード CommonStatusCodes.SIGN_IN_REQUIRED プレーヤーがログインに対して明示的な操作を行う必要があることを示します。この場合、アプリは 次のセクションで説明するように、インタラクティブなログインフローを開始します。

インタラクティブ ログインの実行

プレーヤーの操作でログインするには、アプリでログイン インテントを起動する必要があります。成功した場合、 Google Sign-In API が、プレーヤーに認証情報の入力を求めるユーザー インターフェースを表示する ログインします。このアプローチでは、ログイン アクティビティが処理されるため、アプリの開発が簡素化されます。 Google Play 開発者サービスの更新が必要な場合や、同意プロンプトを表示する場合など、 できます。結果は onActivityResult 呼び出すことができます。

対話形式でログインを行う手順は次のとおりです。

  1. GoogleSignInClientgetSigninIntent() を呼び出してログイン インテントを取得し、次の呼び出しを行います。 startActivity() そのインテントを渡します。次のコード スニペットは、 インタラクティブなログインフローを開始します。

    private void startSignInIntent() {
      GoogleSignInClient signInClient = GoogleSignIn.getClient(this,
          GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
      Intent intent = signInClient.getSignInIntent();
      startActivityForResult(intent, RC_SIGN_IN);
    }
  2. onActivityResult() 返されたインテントの結果を処理します。

    • ログインに成功したら、 GoogleSignInResultGoogleSignInAccount オブジェクト。
    • ログイン結果が成功しなかった場合は、ログインエラー( アラートにエラー メッセージを表示するなど)。 次のコード スニペットは、アプリがプレーヤーのログイン結果を処理する方法を示しています。
    @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();
        }
      }
    }

プレーヤー情報の取得

Google Sign-In API から返される GoogleSignInAccount にプレーヤーが含まれていません。 情報です。ゲームでプレーヤーの表示名やプレーヤー ID などのプレーヤー情報を使用している場合は、 次の手順でこの情報を取得できます。

  1. PlayersClient オブジェクトを取得するには、getPlayersClient() メソッドを呼び出して、 GoogleSignInAccount をパラメータとして渡します。
  2. PlayersClient メソッドを使用して、Player を非同期で読み込みます。 プレーヤーの情報を含むオブジェクト。たとえば、getCurrentPlayer() を呼び出します。 現在ログインしているプレーヤーを読み込みます。タスクが ステータス コード付きの ApiException /SIGN_IN_REQUIRED、 これは、プレーヤーの再認証が必要であることを示しています。これを行うには、 GoogleSignInClient.getSignInIntent() プレーヤーにインタラクティブにログインできます。
  3. タスクが Player オブジェクトを正常に返す場合は、 Player オブジェクトを使用して、特定のプレーヤーの詳細( getDisplayName() または getPlayerId() を選択します。

ログインボタンを提供する

標準の Google ログインボタンをゲームで提供するには、次のいずれかの方法を使用します。 次のようなアプローチがあります。

ユーザーがログインボタンをクリックすると、ゲームはログインフローを開始するために、 ログイン インテント(インタラクティブなログインの実行をご覧ください)。

次のコード スニペットは、onCreate() にログインボタンを追加する方法を示しています。 メソッドを定義します。

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

次のコード スニペットは、ユーザーが広告をクリックしたときにログイン インテントを送信する方法を示しています。 ログインボタンを使用できます。

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

ゲームのポップアップを表示する

ゲーム内にポップアップ ビューを表示するには、GamesClient クラスを使用します。たとえば、ゲームが 「ようこそ」または「実績がロック解除されました」のポップアップを表示できます。Google Play Games サービスを許可するには ゲーム内のビューでポップアップを起動するには、 setViewForPopups() メソッドを呼び出します。次の呼び出しを行うことで、ポップアップを画面上のどこに表示するかをさらにカスタマイズできます。 setGravityForPopups()

プレーヤーのログアウト

ログアウトするには、GoogleSignInClientsignOut() メソッドを呼び出します。

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