登入 Android 遊戲

如果要存取 Google Play 遊戲服務功能,遊戲必須提供 已登入玩家的帳戶。如果玩家未經驗證,遊戲可能會發生錯誤 呼叫 Google Play 遊戲服務 API本文件說明如何 在遊戲中提供順暢的登入體驗。

實作玩家登入

GoogleSignInClient 類別是主要進入點,可擷取目前 以及登入玩家 (如果先前未在) 在應用程式中登入的播放器, 裝置。

如要建立登入用戶端,請按照下列步驟操作:

  1. 透過 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()。 如果兩個條件都相同,也就是說,getLastSignedInAccount() 會傳回 非空值且 hasPermissions() 會傳回 true,您可以放心使用 帳戶為 getLastSignedInAccount() 傳回的帳戶 (即使裝置是由

執行無訊息登入

您可以呼叫 silentSignIn() 擷取目前登入玩家的帳戶。 然後試著在不顯示使用者介面的情況下登入玩家 已成功在其他裝置上登入應用程式。

silentSignIn() 方法會傳回 Task<GoogleSignInAccount>。工作完成後 將先前宣告的 GoogleSignInAccount 欄位設為工作的登入帳戶 會在結果中傳回,或是傳送至 null,表示沒有已登入的使用者。

如果無訊息登入嘗試失敗,您可以選擇傳送登入意圖,以顯示 登入使用者介面 執行互動式登入

由於已登入玩家的狀態可能會在活動不在前景執行時變更, 建議從活動的 silentSignIn() 撥打電話 onResume() 方法。

如要以無訊息模式執行登入程序,請按照下列步驟操作:

  1. GoogleSignInClient 呼叫 silentSignIn() 方法,啟動無訊息登入流程。 這個呼叫會傳回 Task<GoogleSignInAccount> 物件,其中包含 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. 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);
    }
  2. 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 您可以按照這些步驟擷取這項資訊

  1. 呼叫 getPlayersClient() 方法並傳入,取得 PlayersClient 物件 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 遊戲服務 如要在遊戲檢視畫面中顯示彈出式視窗,請呼叫 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.
        }
      });
}