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

ユーザーが認証情報をまだ保存していない場合や、ユーザーがアプリに登録していない場合、ユーザー認証情報の取得リクエストは失敗することがあります。このような場合は、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.

        ...
    }

    ...
}

必要に応じて、確認済みのメールアドレスの ID トークンCredential オブジェクトに含まれているかどうかを確認することもできます。その場合、メールアドレスはすでに Google によって確認されているため、アプリのメール確認の手順をスキップできます。