Если вход одним касанием соответствует вашим потребностям, рассмотрите возможность его использования. One Tap имеет обновленный пользовательский интерфейс и другие улучшения.

Предоставление пользователю подсказок для входа

Запросы на получение учетных данных пользователя могут завершиться ошибкой, если пользователь еще не сохранил учетные данные или еще не зарегистрировался в вашем приложении. В таких ситуациях используйте 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 токен идентификатора. Если это так, вы можете войти в систему пользователя с токеном идентификатора , не требуя от пользователя ввода пароля.

Если объект Credential не содержит токен идентификатора (или вы не хотите использовать токен идентификатора), предварительно заполните поля входа подсказками, которые вы добавили в намерение.

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 токен идентификатора с подтвержденным адресом электронной почты. Если это так, вы можете пропустить шаг проверки электронной почты вашего приложения, так как адрес электронной почты уже проверен Google.