Интегрируйте диспетчер учетных данных с автозаполнением

Начиная с Android 15 Beta 2 в сочетании с androidx.credentials:1.5.0-alpha01 разработчики могут связывать определенные представления, такие как поля имени пользователя или пароля, с запросами диспетчера учетных данных. Когда пользователь фокусируется на одном из этих представлений, соответствующий запрос отправляется в Credential Manager. Полученные учетные данные объединяются между поставщиками и отображаются в пользовательском интерфейсе автозаполнения, например, в предложениях, встроенных в клавиатуру, или в раскрывающихся списках. Эту функцию можно использовать в качестве запасного варианта, когда пользователи случайно отклоняют средство выбора учетной записи Credential Manager, а затем нажимают на соответствующие поля.

Библиотека Jetpack androidx.credentials является предпочтительной конечной точкой, которую разработчики могут использовать для этой функции.

Иллюстрация, показывающая учетные данные в результатах автозаполнения
Рисунок 1. Результаты автозаполнения учетных данных с использованием пароля, ключа доступа и входа в систему с помощью Google.

Выполнение

Чтобы использовать диспетчер учетных данных для отображения учетных данных в результатах автозаполнения, используйте стандартную реализацию для создания GetCredentialRequest , а затем установите для него соответствующие представления. Обработка ответа одинакова независимо от того, поступает ли ответ от вызова API getCredential или PendingGetCredentialRequest , как показано в следующем примере.

Сначала создайте GetCredentialRequest :

Котлин


// Retrieves the user's saved password for your app.
val getPasswordOption = GetPasswordOption()

// Get a passkey from the user's public key credential provider.
val getPublicKeyCredentialOption = GetPublicKeyCredentialOption(
    requestJson = requestJson
)

val getCredRequest = GetCredentialRequest(
    listOf(getPasswordOption, getPublicKeyCredentialOption)
)

Ява


// Retrieves the user's saved password for your app.
GetPasswordOption getPasswordOption = new GetPasswordOption();

// Get a passkey from the user's public key credential provider.
GetPublicKeyCredentialOption getPublicKeyCredentialOption =
    new GetPublicKeyCredentialOption(requestJson);

GetCredentialRequest getCredRequest = new GetCredentialRequest(
    Arrays.asList(getPasswordOption, getPublicKeyCredentialOption)
);

Затем вызовите API getCredential . Откроется селектор диспетчера учетных данных.

Котлин


coroutineScope.launch {
    try {
        val result = credentialManager.getCredential(
            context = activityContext, // Use an activity-based context.
            request = getCredRequest
        )
        handleSignIn(result);
    } catch (GetCredentialException e) {
        handleFailure(e);
    }
}

Ява


coroutineScope.launch(new CoroutineScopeRunnable() {
    @Override
    public void run(@NonNull CoroutineScope scope) {
        try {
            GetCredentialResponse result = credentialManager.getCredential(
                activityContext, // Use an activity-based context.
                getCredRequest
            );
            handleSignIn(result);
        } catch (GetCredentialException e) {
            handleFailure(e);
        }
    }
});

Наконец, включите функцию автозаполнения. Установите для getCredRequest соответствующие представления (например username, password ), чтобы включить автозаполнение результатов учетных данных, когда пользователь взаимодействует с этими представлениями.

Котлин


import androidx.credentials.PendingGetCredentialRequest

usernameEditText.pendingGetCredentialRequest = PendingGetCredentialRequest(
    getCredRequest) { response -> handleSignIn(response)
}

passwordEditText.pendingGetCredentialRequest = PendingGetCredentialRequest(
    getCredRequest) { response -> handleSignIn(response)
}

Ява


import androidx.credentials.CredentialManagerViewHandler;
import androidx.credentials.PendingGetCredentialRequest;

CredentialManagerViewHandler.setPendingGetCredentialRequest(
               usernameEditText, new PendingGetCredentialRequest(
                       getCredRequest, result -> {
                           handleSignIn(result);
                           return null;
                       }
               )

CredentialManagerViewHandler.setPendingGetCredentialRequest(
               passwordEditText, new PendingGetCredentialRequest(
                       getCredRequest, result -> {
                           handleSignIn(result);
                           return null;
                       }
               )