Google ログイン API の非推奨に伴い、2026 年に Google Play Games サービス v1 の SDK を削除します。2025 年 2 月以降、Google Play Games サービス v1 の SDK と新たに統合されたタイトルを Google Play で公開することはできなくなります。代わりに Google Play Games サービス v2 の SDK を使用することをおすすめします。
以前のゲーム v1 統合を使用している既存のタイトルは、今後数年間は引き続き機能しますが、2025 年 6 月から v2 への移行を開始することをおすすめします。
このガイドは、Play Games サービス v1 SDK の使用を対象としています。最新の SDK バージョンについては、v2 のドキュメントをご覧ください。
ゲームでバックエンド サーバーを使用する場合は、Google ログインを使用してプレーヤーを認証し、プレーヤーの ID をバックエンド サーバーに安全に渡すことをおすすめします。そうすることでゲームは、プレーヤーの ID やその他のデータを安全に取得できます。デバイスを通過する間に改ざんの危険にさらされることはありません。
このシナリオでは、ゲームは通常どおり Google Play ゲームサービスへのログインをプレーヤーに促します。プレーヤーが正常にログインすると、GoogleSignInAccount
オブジェクトには、クライアントがサーバーに渡す特別な 1 回限りのコード(サーバー認証コードといいます)が含まれます。次に、サーバー認証コードを、サーバーで Google Play Games サービス API を呼び出すために使用できる OAuth 2.0 トークンに交換します。
ゲームにログインを追加するためのガイダンスについては、Android ゲームでのログインをご覧ください。
Google ログインを使用してプレーヤーを認証する方法を示す詳細なコードサンプルについては、GitHub の clientserverskeleton
サンプルをご覧ください。
オフライン アクセスに必要な手順は次のとおりです。
- Google Play Console で: ゲームサーバーの認証情報を作成します。認証情報の OAuth クライアント タイプは「web」です。
- Android アプリで: ログインの一環として、サーバーの認証情報についてサーバー認証コードをリクエストし、サーバーに渡します。
- ゲームサーバーで: Google 認証サービスを使用してサーバー認証コードを OAuth アクセス トークンに交換し、これを使用して Play ゲームサービスの REST API を呼び出します。
始める前に
Google ログインをゲームに統合する前に、Google Play ゲームサービスのセットアップで説明しているように、Google Play Console にゲームを追加する必要があります。
ゲームに関連付けられたサーバーサイド ウェブアプリを作成する
Google Play Games サービスは、ウェブゲームのバックエンド サポートを提供しません。ただし、Android ゲームのサーバーのバックエンド サポートは提供します。
Google Play Games サービスの REST API をサーバーサイド アプリで使用する場合は、次の手順を行います。
- Google Play Console の [リンクされたアプリ] セクションで、ゲームに関連付けられたウェブアプリを作成します。このフローでは
launch_url
は使用されないため、空白のままにしておきます。 - アプリの認証情報を取得する手順は次のとおりです。
- Google Play Console のゲームから、[ゲームの詳細] をクリックします。
- [API Console Project] セクションまでスクロールし、API Console プロジェクトへのリンクをクリックします。
- Google API Console の [API とサービス] > [認証情報] 画面で、ウェブアプリの
client_secret.json
ファイルをダウンロードし、サーバーがアクセスできる場所に保存します。後で参照できるように、認証情報のクライアント ID を記録します。
- ゲームのクライアント アプリからのリクエストを受け入れる準備ができるように、サーバーサイド アプリを再起動します。
クライアントでログインを実行する
GoogleSignInClient
クラスは、現在ログインしているプレーヤーのアカウントを取得し、プレーヤーがデバイスのアプリでまだログインしていない場合はログインするためのメイン エントリ ポイントです。
ログイン クライアントを作成する手順は次のとおりです。
GoogleSignInOptions
オブジェクトを使用してログイン クライアントを作成します。GoogleSignInOptions.Builder
でログインを設定するには、GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
を指定する必要があります。- また、サーバーのクライアント ID をパラメータとして
GoogleSignInOptions.Builder.requestServerAuthCode()
メソッドを呼び出し、ゲームがバックエンド サーバーの認証コードを必要とすることを指定する必要があります。サーバー認証コードを取得するで説明されているように、バックエンド サーバーのアクセス トークン用の認証コードは後で取得します。 GoogleSignIn.getClient()
メソッドを呼び出し、以前に構成したオプションを渡します。呼び出しが成功すると、Google Sign-In API はGoogleSignInClient
のインスタンスを返します。GoogleSignInClient
インスタンスを取得したら、サイレント ログインを実行するで説明されているように、アクティビティのonResume()
からサイレント ログインに進む必要があります。
次の例をご覧ください。
private static final int RC_SIGN_IN = 9001; private GoogleSignInClient mGoogleSignInClient; private void startSignInForAuthCode() { // Client ID for your backend server. String webClientId = getString(R.string.webclient_id); GoogleSignInOptions signInOption = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestServerAuthCode(webClientId) .build(); GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOption); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }
サーバー認証コードを取得する
ゲームがバックエンド サーバーのアクセス トークンに使用できるサーバー認証コードを取得するには、プレーヤーのログインが成功したときに Google ログインが返す GoogleSignInAccount
オブジェクトの getServerAuthCode()
メソッドを呼び出します。
次の例をご覧ください。
// Auth code to send to backend server. private String mServerAuthCode; @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()) { mServerAuthCode = result.getSignInAccount().getServerAuthCode(); } 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 Play ゲームサービス API を呼び出します。必要に応じて、更新トークンを保存し、アクセス トークンが期限切れになったときに新しいアクセス トークンを取得します。
次のコード スニペットは、サーバーサイド コードを Java プログラミング言語で実装し、サーバー認証コードをアクセス トークンと交換する方法を示しています。clientserverskeleton サンプルアプリを使用しています。
/**
* Exchanges the authcode for an access token credential. The credential
* is the associated with the given player.
*
* @param authCode - the non-null authcode passed from the client.
* @param player - the player object which the given authcode is
* associated with.
* @return the HTTP response code indicating the outcome of the exchange.
*/
private int exchangeAuthCode(String authCode, Player player) {
try {
// The client_secret.json file is downloaded from the Google API
// console. This is used to identify your web application. The
// contents of this file should not be shared.
//
File secretFile = new File("client_secret.json");
// If we don't have the file, we can't access any APIs, so return
// an error.
if (!secretFile.exists()) {
log("Secret file : " + secretFile
.getAbsolutePath() + " does not exist!");
return HttpServletResponse.SC_FORBIDDEN;
}
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
JacksonFactory.getDefaultInstance(), new
FileReader(secretFile));
// Extract the application id of the game from the client id.
String applicationId = extractApplicationId(clientSecrets
.getDetails().getClientId());
GoogleTokenResponse tokenResponse =
new GoogleAuthorizationCodeTokenRequest(
HTTPTransport,
JacksonFactory.getDefaultInstance(),
"https://oauth2.googleapis.com/token",
clientSecrets.getDetails().getClientId(),
clientSecrets.getDetails().getClientSecret(),
authCode,
"")
.execute();
log("hasRefresh == " + (tokenResponse.getRefreshToken() != null));
log("Exchanging authCode: " + authCode + " for token");
Credential credential = new Credential
.Builder(BearerToken.authorizationHeaderAccessMethod())
.setJsonFactory(JacksonFactory.getDefaultInstance())
.setTransport(HTTPTransport)
.setTokenServerEncodedUrl("https://www.googleapis.com/oauth2/v4/token")
.setClientAuthentication(new HttpExecuteInterceptor() {
@Override
public void intercept(HttpRequest request)
throws IOException {
}
})
.build()
.setFromTokenResponse(tokenResponse);
player.setCredential(credential);
// Now that we have a credential, we can access the Games API.
PlayGamesAPI api = new PlayGamesAPI(player, applicationId,
HTTPTransport, JacksonFactory.getDefaultInstance());
// Call the verify method, which checks that the access token has
// access to the Games API, and that the player id used by the
// client matches the playerId associated with the accessToken.
boolean ok = api.verifyPlayer();
// Call a Games API on the server.
if (ok) {
ok = api.updatePlayerInfo();
if (ok) {
// persist the player.
savePlayer(api.getPlayer());
}
}
return ok ? HttpServletResponse.SC_OK :
HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
} catch (IOException e) {
e.printStackTrace();
}
return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}
ログインしたプレーヤーに代わってバックエンド サーバーから Google API にアクセスする方法について詳しくは、サーバーサイド アクセスの有効化をご覧ください。
プレーヤーのログアウトを処理する
ゲームからプレーヤーをログアウトさせるには、GoogleSignInClient
の signOut()
メソッドを呼び出します。コード スニペットの例については、プレーヤーをログアウトするをご覧ください。
サーバーから REST API を呼び出す
利用可能な API 呼び出しの詳細については、Google Play Games サービスの REST API をご覧ください。
REST API 呼び出しのうち、有用だと思われるものの例を次に示します。
プレーヤー
- ログインしているプレーヤーの ID とプロフィール データを取得する場合は、ID として
'me'
を指定して Players.get を呼び出します。
フレンド機能
詳しくは、友だちのガイドをご覧ください。
- プレーヤーの友だちリストを取得する場合は、
'friends_all'
をcollection
として Players.list を呼び出します。 - 友だちリストにアクセスできるかどうかを確認します。
me
に対して Players.get を呼び出し、レスポンスのprofileSettings.friendsListVisibility
フィールドを確認します。
実績
実績について詳しくは、実績のガイドをご覧ください。
- 現在の実績のリストを取得したいですか?AchievementDefinitions.list を呼び出すことができます。
- これを Achievements.list の呼び出しと組み合わせると、プレーヤーがどれをロック解除したのかがわかります。
- プレーヤーは実績を獲得しましたか?Achievements.unlock を使用してロックを解除します。
- プレーヤーは部分的な実績の獲得に向けて進捗を上げましたか?Achievements.increment を使用して進捗状況をレポートします(プレーヤーがロック解除したかどうかを確認します)。
- まだ本番環境にリリースされていないゲームをデバッグしていますか?Management API から Achievements.reset または Achievements.resetAll を呼び出して、実績を元の状態にリセットしてみてください。
リーダーボード
リーダーボードの詳細については、リーダーボードのガイドをご覧ください。
- ゲームの全スコアボードのリストを取得する場合は、Leaderboards.list を呼び出します。
- プレーヤーがゲームを終了したか。スコアを Scores.submit に送信して、新しいハイスコアかどうかを確認できます。
- リーダーボードを表示しますか?Scores.list からデータを取得してユーザーに表示します。
- ユーザーのハイスコアに近いさまざまなスコアを検索するには、Scores.listWindow を使用します。
- 特定のリーダーボードでのプレーヤーのスコアに関する詳細情報(たとえば、あるプレーヤーが全プレーヤーの上位 12% に入っているかどうか)を取得するには、Scores.get を呼び出します。
- ゲームをデバッグしていますか?Management API から Scores.reset を呼び出して、特定のリーダーボードからそのプレーヤーのすべてのスコアをリセットしてみてください。