ユーザーにログインのヒントを提供する

ユーザーが認証情報を保存していない場合や、まだユーザーがアプリに登録していない場合、ユーザー認証情報の取得リクエストは失敗することがあります。このような場合は、Credentials API を使用してユーザー名やメールアドレスなどのログインヒントを取得します。これらのヒントを使用して、アプリのログイン フォームと登録フォームに事前入力することで、アプリのオンボーディング プロセスを高速化できます。

Android 6.0(Marshmallow)以降のアプリでは、Credentials API でログインヒントを取得するために、デバイスや実行時の権限をリクエストする必要はありません。

始める前に

Android Studio プロジェクトを設定します

ログインヒントの取得

ログインヒントを取得するには、まず HintRequest オブジェクトを作成して、ヒントセレクタ ダイアログを構成します。次に、HintRequest オブジェクトを CredentialsClient.getHintPickerIntent() に渡して、ユーザーにメールアドレスの選択を促すインテントを取得します。最後に、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 ログインヒント選択ツール

ユーザーは、使用するメールアドレスを選択するよう求められます。

次に、アクティビティの onActivityResult() メソッドで、Credential.EXTRA_KEY 小包からヒントを取得し、ユーザーがユーザー データベース内にいるかどうかを確認して、認証情報のヒントを使用して適切なアクティビティを開始します。

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

    ...

}

ログイン フォームに事前入力する

ユーザーがユーザー データベースにいて、アプリのログイン アクティビティを開始した場合は、Credential オブジェクトに ID トークンが含まれているかどうかをチェックできます(省略可)。その場合は、ユーザーがパスワードを入力しなくても、ID トークンでログインできます。

Credential オブジェクトに ID トークンが含まれていない場合(または ID トークンを使用しない場合)は、インテントに追加したヒントをログイン フィールドに事前に入力します。

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

        ...
    }

    ...
}

登録フォームに事前入力する

ユーザーがユーザー データベースになく、アプリの登録アクティビティを開始した場合は、登録フィールドに、インテントに追加したログインヒントを事前入力します。

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 でメールアドレスがすでに確認されているため、アプリのメール確認の手順をスキップできます。