存储用户的凭据

<ph type="x-smartling-placeholder">

在用户成功登录、创建账号或更改密码后, 存储其凭据,以便日后在您的应用中自动进行身份验证。

准备工作

配置 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() 的调用未立即 则凭据可能是新的,在这种情况下,用户必须确认 保存请求。使用以下代码解析 ResolvableApiExceptionstartResolutionForResult() 提示用户确认。

如果用户选择不保存凭据,则不会再次提示用户 为该应用保存任何账号的凭据。如果您调用 在用户选择停用后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(密码专用)双向共享。)