存储用户的凭据

在用户成功登录、创建帐号或更改密码后,允许他们存储其凭据,以便在您的应用中自动执行将来的身份验证。

准备工作

配置 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(密码专用)进行双向共享。)