如果要存取 Google Play 遊戲服務功能,遊戲必須提供 已登入玩家的帳戶。如果玩家未經驗證,遊戲可能會發生錯誤 呼叫 Google Play 遊戲服務 API本文件說明如何 在遊戲中提供順暢的登入體驗。
實作玩家登入
GoogleSignInClient
類別是主要進入點,可擷取目前
以及登入玩家 (如果先前未在) 在應用程式中登入的播放器,
裝置。
如要建立登入用戶端,請按照下列步驟操作:
透過
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()
。
如果兩個條件都相同,也就是說,getLastSignedInAccount()
會傳回
非空值且 hasPermissions()
會傳回 true
,您可以放心使用
帳戶為 getLastSignedInAccount()
傳回的帳戶 (即使裝置是由
執行無訊息登入
您可以呼叫 silentSignIn()
擷取目前登入玩家的帳戶。
然後試著在不顯示使用者介面的情況下登入玩家
已成功在其他裝置上登入應用程式。
silentSignIn()
方法會傳回 Task<GoogleSignInAccount>
。工作完成後
將先前宣告的 GoogleSignInAccount
欄位設為工作的登入帳戶
會在結果中傳回,或是傳送至 null
,表示沒有已登入的使用者。
如果無訊息登入嘗試失敗,您可以選擇傳送登入意圖,以顯示 登入使用者介面 執行互動式登入。
由於已登入玩家的狀態可能會在活動不在前景執行時變更,
建議從活動的 silentSignIn()
撥打電話
onResume()
。
方法。
如要以無訊息模式執行登入程序,請按照下列步驟操作:
- 對
GoogleSignInClient
呼叫silentSignIn()
方法,啟動無訊息登入流程。 這個呼叫會傳回Task<GoogleSignInAccount>
物件,其中包含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
您可以按照這些步驟擷取這項資訊
- 呼叫
getPlayersClient()
方法並傳入,取得PlayersClient
物件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 遊戲服務
如要在遊戲檢視畫面中顯示彈出式視窗,請呼叫
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. } }); }