向用户提供登录提示

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

在 Android 6.0 (Marshmallow) 及更高版本上,您的应用无需请求任何设备或运行时权限,即可利用 Credentials API 检索登录提示。

准备工作

配置 Android Studio 项目

检索登录提示

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

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());

        ...
    }

    ...
}

预填写注册表单

如果用户不在用户数据库中,并且您启动了应用的注册 activity,请使用您添加到 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 的验证。