儲存使用者憑證's 憑證

在使用者成功登入、建立帳戶或變更密碼後,允許他們儲存憑證,以便自動在應用程式中執行驗證。

事前準備

設定 Android Studio 專案

儲存憑證

建立包含使用者登入資訊的 Credential 物件。舉例來說,如要讓使用者在使用密碼成功登入後儲存憑證:

Credential credential = new Credential.Builder(email)
        .setPassword(password)  // Important: only store passwords in this field.
                                // Android autofill uses this value to complete
                                // sign-in forms, so repurposing this field will
                                // likely cause errors.
        .build();

或者,在使用者成功使用 Google 帳戶登入後:

GoogleSignInAccount gsa = signInTask.getResult();
Credential credential = new Credential.Builder(gsa.getEmail())
        .setAccountType(IdentityProviders.GOOGLE)
        .setName(gsa.getDisplayName())
        .setProfilePictureUri(gsa.getPhotoUrl())
        .build();

Smart Lock 儲存對話方塊

接著,呼叫 CredentialsClient.save() 即可儲存使用者憑證。如果呼叫 CredentialsClient.save() 並未立即成功,則憑證可能是新的,在此情況下,使用者必須確認儲存要求。使用 startResolutionForResult() 解析 ResolvableApiException,提示使用者進行確認。

如果使用者選擇不儲存憑證,系統不會再次提示使用者儲存應用程式的任何帳戶憑證。如果您在使用者選擇不採用後呼叫 CredentialsClient.save(),則結果的狀態碼為 CANCELED。使用者之後可以前往 Google 設定應用程式的「密碼專用 Smart Lock」部分選擇啟用。使用者必須為所有帳戶啟用憑證儲存功能,系統下次才會提示您儲存憑證。

mCredentialsClient.save(credential).addOnCompleteListener(
        new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "SAVE: OK");
                    Toast.makeText(activity, "Credentials saved", Toast.LENGTH_SHORT).show();
                    return;
                }

                Exception e = task.getException();
                if (e instanceof ResolvableApiException) {
                    // Try to resolve the save request. This will prompt the user if
                    // the credential is new.
                    ResolvableApiException rae = (ResolvableApiException) e;
                    try {
                        rae.startResolutionForResult(this, RC_SAVE);
                    } catch (IntentSender.SendIntentException exception) {
                        // Could not resolve the request
                        Log.e(TAG, "Failed to send resolution.", exception);
                        Toast.makeText(activity, "Save failed", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    // Request has no resolution
                    Toast.makeText(activity, "Save failed", Toast.LENGTH_SHORT).show();
                }
            }
        });</pre>

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // ...

        if (requestCode == RC_SAVE) {
            if (resultCode == RESULT_OK) {
                Log.d(TAG, "SAVE: OK");
                Toast.makeText(this, "Credentials saved", Toast.LENGTH_SHORT).show();
            } else {
                Log.e(TAG, "SAVE: Canceled by user");
            }
        }

        // ...

    }

儲存憑證後,請透過呼叫 CredentialsClient.request() 擷取憑證。

指定 Android O 以上版本

在搭載 Android O 以上版本的裝置上使用 Smart Lock 儲存密碼憑證時,Smart Lock 會盡可能使用原生自動填入確認對話方塊,而非本身的對話方塊。(請注意,透過 Google 自動填入功能儲存的憑證會與密碼專用 Smart Lock 雙向共用)。