使用 Credentials API 提出要求,自動將使用者登入您的應用程式 並為使用者擷取已儲存的憑證
事前準備
建立 CredentialsClient 物件
如要要求儲存的憑證,您必須建立
CredentialsClient 可存取 Credentials API:
CredentialsClient mCredentialsClient;
// ...
mCredentialsApiClient = Credentials.getClient(this);
建立 CredentialRequest 物件
CredentialRequest 物件會指定
登入系統來要求憑證。建立
對 CredentialRequest 使用 setPasswordLoginSupported 方法
密碼式登入,以及聯合的 setAccountTypes() 方法
登入服務,例如 Google 登入。
mCredentialRequest = new CredentialRequest.Builder()
    .setPasswordLoginSupported(true)
    .setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
    .build();
使用 IdentityProviders 中定義的常數
指定常用的登入提供者。如要使用其他登入服務供應商,請使用
專門用來識別供應器的字串。必須使用相同的提供者 ID
儲存憑證,用於擷取憑證。
要求儲存的憑證
建立 CredentialsClient 和 CredentialRequest 物件後,請傳遞要求物件
「CredentialsClient.request()」
要求為應用程式儲存的憑證。
  mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
      new OnCompleteListener<CredentialRequestResponse>() {
          @Override
          public void onComplete(@NonNull Task<CredentialRequestResponse> task) {
              if (task.isSuccessful()) {
                  // See "Handle successful credential requests"
                  onCredentialRetrieved(task.getResult().getCredential());
                  return;
              }
              // See "Handle unsuccessful and incomplete credential requests"
              // ...
          }
      });
定義回呼,以使用
addOnCompleteListener() 方法。
處理成功的憑證要求
 收到成功的憑證要求後,請將產生的
收到成功的憑證要求後,請將產生的
Credential
物件,完成使用者登入應用程式的程序。使用 getAccountType() 方法
判斷已擷取憑證的類型,然後完成適當的登入程序
上傳資料集之後,您可以運用 AutoML
自動完成部分資料準備工作例如,如果是 Google 登入,請建立 GoogleSignInClient 物件,且該物件
包含使用者的 ID,然後使用這個物件啟動登入流程。密碼式
登入時,請使用 Credential 物件中的使用者 ID 和密碼,完成應用程式的
登入程序。
private void onCredentialRetrieved(Credential credential) {
    String accountType = credential.getAccountType();
    if (accountType == null) {
        // Sign the user in with information from the Credential.
        signInWithPassword(credential.getId(), credential.getPassword());
    } else if (accountType.equals(IdentityProviders.GOOGLE)) {
        // The user has previously signed in with Google Sign-In. Silently
        // sign in the user with the same ID.
        // See https://developers.google.com/identity/sign-in/android/
        GoogleSignInOptions gso =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .build();
        GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
        Task<GoogleSignInAccount> task = signInClient.silentSignIn();
        // ...
    }
}
處理多個已儲存的憑證

需要使用者輸入內容才能選取憑證時,request() 工作會
失敗時傳回 ResolvableApiException。請確認
getStatusCode() 會傳回 RESOLUTION_REQUIRED 和
呼叫例外狀況的 startResolutionForResult() 方法,提示使用者
選擇帳戶。再從
將 Credential.EXTRA_KEY 傳遞至onActivityResult()
getParcelableExtra()敬上
方法。
mCredentialsClient.request(request).addOnCompleteListener( new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { // ... return; } Exception e = task.getException(); if (e instanceof ResolvableApiException) { // This is most likely the case where the user has multiple saved // credentials and needs to pick one. This requires showing UI to // resolve the read request. ResolvableApiException rae = (ResolvableApiException) e; resolveResult(rae, RC_READ); } else if (e instanceof ApiException) { // The user must create an account or sign in manually. Log.e(TAG, "Unsuccessful credential request.", e); ApiException ae = (ApiException) e; int code = ae.getStatusCode(); // ... } } }); 
private void resolveResult(ResolvableApiException rae, int requestCode) {
    try {
        rae.startResolutionForResult(MainActivity.this, requestCode);
        mIsResolving = true;
    } catch (IntentSender.SendIntentException e) {
        Log.e(TAG, "Failed to send resolution.", e);
        hideProgress();
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // ...
    if (requestCode == RC_READ) {
        if (resultCode == RESULT_OK) {
            Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
            onCredentialRetrieved(credential);
        } else {
            Log.e(TAG, "Credential Read: NOT OK");
            Toast.makeText(this, "Credential Read Failed", Toast.LENGTH_SHORT).show();
        }
    }
    // ...
}
如果找不到已儲存的憑證,使用者必須建立帳戶或手動建立帳戶
登入帳戶。如果getStatusCode()
會傳回 SIGN_IN_REQUIRED,
您可以選擇在收到提示後
使用者可以選擇最近使用的登入資訊,例如電子郵件地址和
並根據這些資訊自動填入表單部分欄位。
請參閱「為使用者提供登入提示」
。
使用者成功登入時,請允許使用者儲存自己的憑證 ,以便在所有裝置上自動進行驗證。