Liveness (Android)
Compatibilidad y Requisitos
1. Configuración del Proyecto
Configura las dependencias del proyecto agregando la librería en tus archivos de Gradle y el catálogo de versiones.
libs.versions.toml
[versions]
dicioLiveness = "1.5.0-rc1"
[libraries]
dicio-sdkliveness = { group = "io.bitbucket.juarezsdco", name = "sdkliveness", version.ref = "dicioLiveness" }
build.gradle
dependencies {
implementation(libs.dicio.sdkliveness)
}
2. Personalización (opcional)
Agrega la siguiente función a tu código y llámala antes de ejecutar el SDK, modificando los colores de acuerdo a tu flujo:
ConfigStyle.kt
private fun setConfigStyle() {
// Personaliza los colores del SDK aquí de acuerdo a tu flujo
Config.backgroundColorCustom = "#121212"
Config.outerBackgroundColorCustom = "#000000"
Config.frameColorCustom = "#1E1E1E"
Config.borderColorCustom = "#3700B3"
Config.ovalColorCustom = "#03DAC6"
Config.dualSpinnerColorCustom = "#03DAC6"
Config.textColorCustom = "#FFFFFF"
Config.buttonAndFeedbackBarColorCustom = "#6200EE"
Config.buttonAndFeedbackBarTextColorCustom = "#ffffff"
Config.buttonColorHighlightCustom = "#3700B3"
Config.buttonColorDisabledCustom = "#424242"
Config.showCancelButton = true
Config.applyAllCustomizations()
}
3. Personalización de Textos (opcional)
Para personalizar los textos que muestra el DicioLivenessSdk, debes agregar un archivo XML values-es.xml en la carpeta res/values-es/ de tu proyecto. Este archivo te permitirá sobreescribir las cadenas de texto por defecto del SDK con tus propias versiones personalizadas en español.
values-es.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="FaceTec_accessibility_cancel_button">Cancelar</string>
<string name="FaceTec_accessibility_feedback_face_not_on_camera">El rostro no es visible en la cámara o está muy lejos</string>
<string name="FaceTec_accessibility_feedback_face_pointing_too_far_left">Tu rostro apunta muy a la izquierda</string>
<string name="FaceTec_accessibility_feedback_face_pointing_too_far_right">Tu rostro apunta muy a la derecha</string>
<string name="FaceTec_accessibility_feedback_face_rotated_too_far_left">Tu rostro está muy rotado a la izquierda</string>
<string name="FaceTec_accessibility_feedback_face_rotated_too_far_right">Tu rostro está muy rotado a la derecha</string>
<string name="FaceTec_accessibility_feedback_face_too_far_left">Tu rostro está muy a la izquierda</string>
<string name="FaceTec_accessibility_feedback_face_too_far_right">Tu rostro está muy a la derecha</string>
<string name="FaceTec_accessibility_feedback_face_too_high">Tu rostro está muy arriba</string>
<string name="FaceTec_accessibility_feedback_face_too_low">Tu rostro está muy abajo</string>
<string name="FaceTec_accessibility_feedback_hold_device_to_eye_level">Mantén el dispositivo a nivel de los ojos</string>
<string name="FaceTec_accessibility_feedback_move_phone_away">Tu rostro está muy cerca</string>
<string name="FaceTec_accessibility_feedback_move_phone_closer">Tu rostro está muy lejos</string>
<string name="FaceTec_accessibility_tap_guidance">Toca dos veces en la pantalla para una guía de alineación del rostro.</string>
<string name="FaceTec_accessibility_torch_button">Interruptor de luz</string>
<string name="FaceTec_action_accept_photo">ACEPTAR</string>
<string name="FaceTec_action_confirm">CONFIRMAR INFORMACIÓN</string>
<string name="FaceTec_action_continue">CONTINUAR</string>
<string name="FaceTec_action_im_ready">ESTOY LISTO</string>
<string name="FaceTec_action_ok">OK</string>
<string name="FaceTec_action_retake_photo">REPETIR</string>
<string name="FaceTec_action_scan_nfc">ESCANEAR NUEVAMENTE</string>
<string name="FaceTec_action_scan_nfc_card">ESCANEAR NUEVAMENTE</string>
<string name="FaceTec_action_skip_nfc">SALTAR ESTE PASO</string>
<string name="FaceTec_action_take_photo">TOMAR FOTO</string>
<string name="FaceTec_action_try_again">INTENTAR OTRA VEZ</string>
<string name="FaceTec_camera_permission_enable_camera">HABILITAR CÁMARA</string>
<string name="FaceTec_camera_permission_header">Habilitar cámara</string>
<string name="FaceTec_camera_permission_launch_settings">ABRIR CONFIGURACIÓN</string>
<string name="FaceTec_camera_permission_message_auth">Cámara deshabilitada. Toca abajo para editar la configuración.</string>
<string name="FaceTec_camera_permission_message_enroll">Por favor toca el botón para habilitar tu cámara frontal.</string>
<string name="FaceTec_feedback_center_face">Centra tu rostro</string>
<string name="FaceTec_feedback_face_not_found">Encuadra tu rostro en el óvalo</string>
<string name="FaceTec_feedback_face_not_looking_straight_ahead">Mira al frente</string>
<string name="FaceTec_feedback_face_not_upright">Mantén tu cabeza recta</string>
<string name="FaceTec_feedback_hold_steady">Mantente quieto</string>
<string name="FaceTec_feedback_move_phone_away">Aléjate un poco</string>
<string name="FaceTec_feedback_move_phone_closer">Acércate un poco</string>
<string name="FaceTec_feedback_move_phone_to_eye_level">Coloca la cámara al nivel de los ojos</string>
<string name="FaceTec_feedback_use_even_lighting">Ilumina tu rostro de forma uniforme</string>
<string name="FaceTec_idscan_additional_review_message">Se requiere\\nuna revisión adicional</string>
<string name="FaceTec_idscan_capture_hold_steady_message">Mantente quieto</string>
<string name="FaceTec_idscan_capture_id_back_instruction_message">Parte trasera del documento</string>
<string name="FaceTec_idscan_capture_id_front_instruction_message">Parte frontal del documento</string>
<string name="FaceTec_idscan_capture_tap_to_focus_message">Toca la pantalla para enfocar</string>
<string name="FaceTec_idscan_nfc_card_status_finished_with_error_message">No se pudo leer\\nel chip del ID</string>
<string name="FaceTec_idscan_nfc_card_status_ready_message">Prepárate para escanear\\nel chip de tu ID</string>
<string name="FaceTec_idscan_nfc_card_status_starting_message">Mantén tu teléfono cerca de tu ID\\npara escanear el chip NFC</string>
<string name="FaceTec_idscan_nfc_status_disabled_message">Habilita el NFC\\nen tu configuración\\npara continuar</string>
<string name="FaceTec_idscan_nfc_status_finished_with_error_message">No se pudo leer\\nel chip del Pasaporte Electrónico</string>
<string name="FaceTec_idscan_nfc_status_finished_with_success_message">Escaneo del documento\\ncompletado</string>
<string name="FaceTec_idscan_nfc_status_ready_message">Prepárate para escanear\\nel chip de tu Pasaporte Electrónico</string>
<string name="FaceTec_idscan_nfc_status_scanning_message">Mantente quieto,\\nescaneando el chip NFC</string>
<string name="FaceTec_idscan_nfc_status_skipped_message">Escaneo NFC\\nsaltado</string>
<string name="FaceTec_idscan_nfc_status_starting_message">Acerca el teléfono a la\\nparte trasera del Pasaporte Electrónico\\npara escanear el chip NFC</string>
<string name="FaceTec_idscan_nfc_status_weak_connection_message">Intentemos\\notro escaneo</string>
<string name="FaceTec_idscan_ocr_confirmation_main_header">Revisa y confirma</string>
<string name="FaceTec_idscan_ocr_confirmation_scroll_message">Desplázate hacia abajo</string>
<string name="FaceTec_idscan_review_id_back_instruction_message">Verifica que esté claro y legible</string>
<string name="FaceTec_idscan_review_id_front_instruction_message">Verifica que esté claro y legible</string>
<string name="FaceTec_idscan_type_selection_header">Prepárate para escanear\\ntu identificación</string>
<string name="FaceTec_initializing_camera">Asegurando la conexión</string>
<string name="FaceTec_instructions_header_ready_1">Prepárate para</string>
<string name="FaceTec_instructions_header_ready_2">tu video selfie</string>
<string name="FaceTec_instructions_message_ready_1">Encuadra tu rostro en el óvalo</string>
<string name="FaceTec_instructions_message_ready_2">Presiona "Estoy listo" y acércate</string>
<string name="FaceTec_presession_brighten_your_environment">Ilumina tu entorno</string>
<string name="FaceTec_presession_conditions_too_bright">Mucha luz</string>
<string name="FaceTec_presession_frame_your_face">Encuadra tu rostro en el óvalo</string>
<string name="FaceTec_presession_hold_steady_1">No te muevas durante: 1</string>
<string name="FaceTec_presession_hold_steady_2">No te muevas durante: 2</string>
<string name="FaceTec_presession_hold_steady_3">No te muevas durante: 3</string>
<string name="FaceTec_presession_neutral_expression">Expresión neutral, sin sonreír</string>
<string name="FaceTec_presession_position_face_straight_in_oval">Mira al frente</string>
<string name="FaceTec_presession_remove_dark_glasses">Quítate las gafas oscuras</string>
<string name="FaceTec_result_facescan_upload_message">Subiendo\\nescaneo 3D\\nencriptado</string>
<string name="FaceTec_result_idscan_retry_barcode_not_read_message">No se pudo escanear el código de barras\\nPor favor inténtalo de nuevo</string>
<string name="FaceTec_result_idscan_retry_face_did_not_match_message">El rostro no coincide\\nlo suficiente</string>
<string name="FaceTec_result_idscan_retry_id_not_fully_visible_message">El documento\\nno es completamente visible</string>
<string name="FaceTec_result_idscan_retry_id_type_not_supported_message">Este tipo de documento no es soportado\\nPor favor usa un documento diferente</string>
<string name="FaceTec_result_idscan_retry_ocr_results_not_good_enough_message">El texto del documento no es legible</string>
<string name="FaceTec_result_idscan_skip_or_error_nfc_message">Info del documento\\nsubida</string>
<string name="FaceTec_result_idscan_success_additional_review_message">Captura de foto de ID\\ncompletada</string>
<string name="FaceTec_result_idscan_success_back_side_message">Escaneo del documento completado</string>
<string name="FaceTec_result_idscan_success_back_side_nfc_next_message">Parte trasera del ID\\nescaneada</string>
<string name="FaceTec_result_idscan_success_front_side_back_next_message">Parte frontal del ID\\nescaneada</string>
<string name="FaceTec_result_idscan_success_front_side_message">Escaneo del documento completado</string>
<string name="FaceTec_result_idscan_success_front_side_nfc_next_message">Parte frontal del ID\\nescaneada</string>
<string name="FaceTec_result_idscan_success_nfc_message">Escaneo del documento completado</string>
<string name="FaceTec_result_idscan_success_passport_message">Escaneo de pasaporte completado</string>
<string name="FaceTec_result_idscan_success_passport_nfc_next_message">Pasaporte escaneado</string>
<string name="FaceTec_result_idscan_success_user_confirmation_message">Escaneo de ID con foto\\ncompletado</string>
<string name="FaceTec_result_idscan_unsuccess_message">La foto del documento\\nno coincide con\\nel rostro del usuario</string>
<string name="FaceTec_result_idscan_upload_message">Subiendo\\nescaneo de ID encriptado</string>
<string name="FaceTec_result_nfc_upload_message">Subiendo\\ninfo NFC encriptada</string>
<string name="FaceTec_result_success_message">Listo</string>
<string name="FaceTec_retry_header">Vamos a intentarlo de nuevo</string>
<string name="FaceTec_retry_ideal_image_label">Pose ideal</string>
<string name="FaceTec_retry_instruction_message_1">Expresión neutral, sin sonreír</string>
<string name="FaceTec_retry_instruction_message_2">Sin brillo ni iluminación extrema</string>
<string name="FaceTec_retry_instruction_message_3">Demasiado borroso, limpia tu cámara</string>
<string name="FaceTec_retry_subheader_message">Necesitamos un video selfie más claro</string>
<string name="FaceTec_retry_your_image_label">Tu selfie</string>
</resources>
4. Iniciando el proceso de Liveness
Para iniciar el proceso de prueba de vida (liveness), el desarrollador debe llamar a la función startLivenessActivity de la clase DicioLivenessSdk.
Sintaxis
DicioLivenessSdk.startLivenessActivity(
context: Context,
token: String,
retries: Int,
playOnSound: Boolean,
urlBase: String,
callback: DicioLivenessCallback
)
- Context: El contexto de la aplicación o actividad que llamará al SDK.
- Token: El token de autenticación requerido para inicializar la verificación.
- retries: El número máximo de intentos que el usuario puede hacer antes de fallar la verificación.
- playOnSound: Habilita o deshabilita el sistema de guía por voz.
- urlBase: URL para validar el token y obtener licencias.
- Callback: Implementación de la interfaz
DicioLivenessCallbackque manejará los resultados.
Ejemplo de Uso
LivenessScreen.kt
private fun initDicioLivenes(token: String, retries: Int, urlBase: String){
// Invoca el SDK pasando los parámetros necesarios
DicioLivenessSdk.startLivenessActivity(this, token, retries, true, urlBase, object : DicioLivenessCallback
{
override fun DicioLvOnSuccess(resultData: String, image: String, retries: Int) {
// Verificación exitosa. Procesa los datos recibidos.
println("resultDataSuccess: $resultData")
println("imageFACE: $image")
println("retries: $retries")
// Aquí puedes proceder con tu flujo
}
override fun DicioLvResReceived(resultData: String, image: String, retries: Int) {
// Invocado cada vez que se realiza un intento
println("resultData: $resultData")
println("imageFACE: $image")
println("retries: $retries")
}
override fun DicioLvonFailure(errorMessage: String) {
// Ocurrió un error durante el proceso
println("errorMessage: $errorMessage")
// Aquí puedes manejar otros errores o registrarlos
}
override fun DicioLvonCancel(cancelMessage: String, retries: Int) {
// El proceso fue cancelado (por el usuario o porque se superaron los intentos máximos)
println("cancelMessage: $cancelMessage")
println("attempts: $retries")
// Aquí puedes navegar hacia atrás
}
})
}
Interfaz DicioLivenessCallback
Esta interfaz maneja los resultados de la verificación de liveness.
Métodos:
- DicioLvOnSuccess:
- Descripción: Invocado cuando la prueba de vida (liveness) fue exitosa.
- Parámetros:
resultData: Resultado de la verificación en formato JSON.image: Imagen capturada durante el proceso de liveness en b64.retries: Número de intentos.
- DicioLvOnResReceived:
- Descripción: Invocado cada vez que se realiza un intento.
- Parámetros:
resultData: Resultado de la verificación en formato JSON.image: Imagen capturada durante el proceso de liveness en b64.retries: Número de intentos.
- DicioLvonFailure:
- Descripción: Invocado cuando hay un error durante el proceso.
- Parámetro:
errorMessage: Mensaje de error en formato JSON.
- DicioLvonCancel:
- Descripción: Invocado cuando el usuario cancela la verificación.
- Parámetro:
cancelMessage: Mensaje explicando por qué se canceló el proceso.retries: Número de intentos.
Manejo de Errores
El SDK maneja diferentes tipos de errores, los cuales son retornados mediante el método DicioLvonFailure. Los mensajes de error están en formato JSON y contienen las claves:
- "Code": Código de cancelación.
- "Message": Descripción de la cancelación.
De igual manera retorna la cantidad de intentos al momento de su cancelación:
- "Retries": Número de intentos.
Errores y Códigos de Respuesta
El SDK retorna diferentes códigos de estados y mensajes que te permitirán entender qué pasó en la verificación.
Mensajes de éxito:
- "Liveness confirmed" : El liveness fue exitoso y la verificación está completa.
Mensajes de Error:
| Código de error | Descripción |
|---|---|
NETWORK_ERROR | Error de red durante la solicitud. |
SESSION_TOKEN_ERROR | Error al recuperar el token de sesión. |
SDK_INITIALIZATION_FAILED | La inicialización del SDK falló. |
TOKEN_NOT_VALID | El token proporcionado es inválido. |
NO_INTERNET | No hay conexión a internet disponible. |
TOKEN_EMPTY | El token está vacío o falta. |
RETRIES_INVALID | El número de intentos debe ser mayor a 0. |
UNEXPECTED_API_RESPONSE | Respuesta inesperada de la API. |
JSON_PARSE_ERROR | Error al parsear la respuesta JSON. |
TOKEN_NOT_VALID | Token inválido. |
Mensajes de Cancelación:
| Código de cancelación | Descripción |
|---|---|
USER_CANCEL | La sesión fue cancelada satisfactoriamente. |
MAX_RETRIES_REACHED | Se alcanzó el número máximo de intentos permitidos. |