向用户提供登录提示

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

如果用户尚未保存,检索用户凭据的请求可能会失败 或用户尚未注册应用的情况。在这些 请使用 Credentials API 检索登录提示,例如 用户名和电子邮件地址。使用这些提示预填充应用的登录信息 和注册表单,从而加快应用的新手入门流程。

在 Android 6.0 (Marshmallow) 及更高版本中,您的应用无需请求 任何设备或运行时权限,以便检索使用 Credentials API。

准备工作

配置 Android Studio 项目

检索登录提示

要检索登录提示,请先通过以下方式配置提示选择器对话框: 创建 HintRequest 对象。然后,将 HintRequest 对象传递给 CredentialsClient.getHintPickerIntent() 来获取提示用户选择电子邮件地址的 intent。最后,启动 intent 与 startIntentSenderForResult() 搭配使用。

HintRequest hintRequest = new HintRequest.Builder()
       
.setHintPickerConfig(new CredentialPickerConfig.Builder()
               
.setShowCancelButton(true)
               
.build())
       
.setEmailAddressIdentifierSupported(true)
       
.setAccountTypes(IdentityProviders.GOOGLE)
       
.build();

PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
    startIntentSenderForResult
(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
   
Log.e(TAG, "Could not start hint picker Intent", e);
}

Smart Lock 登录提示选择器

系统会提示用户选择要使用的电子邮件地址。

然后,在 activity 的 onActivityResult() 方法中,从 Credential.EXTRA_KEY parcel,检查用户是否在您的用户数据库中, 并使用凭据提示启动相应的 activity。

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

   
if (requestCode == RC_HINT) {
       
if (resultCode == RESULT_OK) {
           
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
           
Intent intent;
           
// Check for the user ID in your user database.
           
if (userDatabaseContains(credential.getId())) {
                intent
= new Intent(this, SignInActivity.class);
           
} else {
                intent
= new Intent(this, SignUpNewUserActivity.class);
           
}
            intent
.putExtra("com.mycompany.myapp.SIGNIN_HINTS", credential);
            startActivity
(intent);
       
} else {
           
Log.e(TAG, "Hint Read: NOT OK");
           
Toast.makeText(this, "Hint Read Failed", Toast.LENGTH_SHORT).show();
       
}
   
}

   
...

}

预填写登录表单

如果用户位于您的用户数据库中,并且您启动了应用的登录 activity 中,您可以(可选)检查 Credential 对象是否包含 ID 令牌。如果是这样,您可以使用 ID 令牌让用户登录, 而无需用户输入密码

如果 Credential 对象不包含 ID 令牌(或者您不希望使用 ID 令牌),请使用您添加到 intent。

public class SignInActivity extends Activity {

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);

       
Intent intent = getIntent();
       
Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

       
// Pre-fill ID field
        mUsernameView
.setText(credential.getId());

       
...
   
}

   
...
}

预填写注册表单

如果用户不在您的用户数据库中,并且您已开始注册应用 活动,请用您添加到 intent。

public class SignUpNewUserActivity extends Activity {

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);

       
Intent intent = getIntent();
       
Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

       
// Pre-fill sign-up fields
        mUsernameView
.setText(credential.getId());
        mDisplaynameView
.setText(credential.getName()); // Might be null.

       
...
   
}

   
...
}

您还可以选择检查 Credential 对象是否包含 ID 令牌,它的 验证电子邮件地址。如果是这样,您可以跳过应用的电子邮件验证步骤, 因为此电子邮件地址已经过 Google 验证。