Cómo integrar Credential Manager con la función Autocompletar

A partir de la versión beta 2 de Android 15, junto con androidx.credentials:1.5.0-alpha01, los desarrolladores pueden vincular vistas específicas, como campos de nombre de usuario o contraseña, con solicitudes del Administrador de credenciales. Cuando el usuario se enfoca en una de estas vistas, la solicitud correspondiente se envía al Administrador de credenciales. Las credenciales resultantes se agregan a todos los proveedores y se muestran en las IU de Autocompletar, como las sugerencias intercaladas de teclado o las sugerencias desplegables. Esta función se puede usar como resguardo cuando los usuarios rechazan accidentalmente el selector de cuentas del Administrador de credenciales y, luego, presionan los campos relevantes.

La biblioteca Jetpack androidx.credentials es el extremo preferido para desarrolladores usar para esta función.

Ilustración que muestra las credenciales en los resultados de Autocompletar
Figura 1: Resultados de Autocompletar con credenciales que usan contraseña, llave de acceso y Acceder con Google

Implementación

Para usar el Administrador de credenciales y mostrar credenciales en los resultados de autocompletado, usa la implementación estándar para compilar un GetCredentialRequest y, luego, configúralo en las vistas relevantes. El manejo de respuestas es el mismo, ya sea que la respuesta proviene de la llamada a la API de getCredential o de PendingGetCredentialRequest, como se muestra en el siguiente ejemplo.

Primero, construye un GetCredentialRequest:

Kotlin

// 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)
)

Java

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

A continuación, llama a la API de getCredential. Se mostrará el selector del Administrador de credenciales.

Kotlin

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

Java

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

Por último, habilita la experiencia de Autocompletar. Establece el getCredRequest como relevante. vistas (como username, password) para habilitar los resultados de credenciales en Autocompletar cuando el usuario interactúe con estas vistas.

Kotlin

import androidx.credentials.PendingGetCredentialRequest

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

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

Java

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