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 en todos los proveedores y se muestran en las IU de Autocompletar, como las sugerencias intercaladas del 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 androidx.credentials de Jetpack es el extremo preferido que los desarrolladores deben usar para esta función.

Ilustración que muestra credenciales en los resultados del autocompletado
Figura 1: Resultados de Autocompletar con credenciales mediante 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 control de la respuesta es el mismo, ya sea que la respuesta provenga 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 en vistas relevantes (como username, password) para habilitar los resultados de credenciales en Autocompletar cuando el usuario interactúa 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;
                       }
               )