Google Play Games サービスの機能にアクセスするには、ゲームに 表示されます。プレーヤーが認証されていない場合、ゲームでエラーが発生することがあります。 。このドキュメントでは、ゲームにシームレスなログイン エクスペリエンスを実装する方法について説明します。
プレーヤーのログインの実装
GoogleSignInClient
クラスは、現在のアカウントのアカウントを取得するためのメインのエントリ ポイントです。
ログインする必要があります。また、アプリでログインしたことがない場合は、
ダウンロードします
ログイン クライアントを作成する手順は次のとおりです。
API を介してログイン クライアントを作成する
GoogleSignInOptions
オブジェクトを宣言します。GoogleSignInOptions.Builder
ログインを構成するには、GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
。GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
「新規顧客の獲得」目標を
SnapshotsClient
次に.requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
をGoogleSignInOptions.Builder
これを次のコード スニペットに示します。GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) .build();
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()
メソッドを呼び出します。
サイレント ログインを行う手順は次のとおりです。
GoogleSignInClient
のsilentSignIn()
メソッドを呼び出して、サイレント ログインのフローを開始します。 この呼び出しは、次の場合にGoogleSignInAccount
を含むTask<GoogleSignInAccount>
オブジェクトを返します。 サイレント ログインが成功した場合です。- プレーヤーのログインの成功または失敗を処理する
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
呼び出すことができます。
対話形式でログインを行う手順は次のとおりです。
GoogleSignInClient
でgetSigninIntent()
を呼び出してログイン インテントを取得し、次の呼び出しを行います。startActivity()
そのインテントを渡します。次のコード スニペットは、 インタラクティブなログインフローを開始します。private void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }
onActivityResult()
返されたインテントの結果を処理します。- ログインに成功したら、
GoogleSignInResult
のGoogleSignInAccount
オブジェクト。 - ログイン結果が成功しなかった場合は、ログインエラー( アラートにエラー メッセージを表示するなど)。 次のコード スニペットは、アプリがプレーヤーのログイン結果を処理する方法を示しています。
@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 などのプレーヤー情報を使用している場合は、
次の手順でこの情報を取得できます。
PlayersClient
オブジェクトを取得するには、getPlayersClient()
メソッドを呼び出して、GoogleSignInAccount
をパラメータとして渡します。PlayersClient
メソッドを使用して、Player
を非同期で読み込みます。 プレーヤーの情報を含むオブジェクト。たとえば、getCurrentPlayer()
を呼び出します。 現在ログインしているプレーヤーを読み込みます。タスクが ステータス コード付きのApiException
/SIGN_IN_REQUIRED
、 これは、プレーヤーの再認証が必要であることを示しています。これを行うには、GoogleSignInClient.getSignInIntent()
プレーヤーにインタラクティブにログインできます。- タスクが
Player
オブジェクトを正常に返す場合は、Player
オブジェクトを使用して、特定のプレーヤーの詳細(getDisplayName()
またはgetPlayerId()
を選択します。
ログインボタンを提供する
標準の Google ログインボタンをゲームで提供するには、次のいずれかの方法を使用します。 次のようなアプローチがあります。
com.google.android.gms.common.SignInButton
を含める メイン アクティビティ レイアウトに配置します。または- 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()
。
プレーヤーのログアウト
ログアウトするには、GoogleSignInClient
の signOut()
メソッドを呼び出します。
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. } }); }