Liveness
Descripción General
El SDK DicioLivenessSdk está diseñado para realizar verificaciones de liveness. Permite a los desarrolladores integrar la funcionalidad de verificación facial en sus aplicaciones móviles Android. El SDK gestiona la creación de una sesión de liveness, captura las imágenes y proporciona callbacks para manejar los resultados de la verificación.
Requisitos Previos
Compatibilidad
| Lenguaje | Versión Android | Versión SDK | Android Studio |
|---|---|---|---|
| Kotlin/Java | Android 7+ | 24+ | Jellyfish+ |
- Permisos en el Manifest: Asegúrate de agregar los siguientes permisos en tu archivo
AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- Configuración del Proyecto: Añade las siguientes dependencias en tu archivo
build.gradle:
implementation(libs.okhttp3)
implementation(files("libs/face-9.6.81.aar"))
implementation(files("libs/sdkliveness.aar"))
libs.versions.toml:
okhttp3 = { group = "com.squareup.okhttp3", name = "okhttp", version = "4.11.0" }
Personalización(opcional)
Agrega la siguiente función en tu código y mandala llamar antes de lanzar el SDK y modifica los colores segun tu flujo:
private fun setConfigStyle() {
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()
}
Personalización de textos(opcional)
Para personalizar los textos mostrados por el SDK DicioLivenessSdk, debes agregar un archivo XML values-es.xml en la carpeta res/values-es/ de tu proyecto. Este archivo permitirá sobrescribir las cadenas de texto predeterminadas del SDK con tus propias versiones en español.
<?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 se ve en la cámara o está demasiado lejos</string>
<string name="FaceTec_accessibility_feedback_face_pointing_too_far_left">Tu rostro está demasiado inclinado hacia la izquierda</string>
<string name="FaceTec_accessibility_feedback_face_pointing_too_far_right">Tu rostro está demasiado inclinado hacia la derecha</string>
<string name="FaceTec_accessibility_feedback_face_rotated_too_far_left">Tu rostro gira demasiado a la izquierda</string>
<string name="FaceTec_accessibility_feedback_face_rotated_too_far_right">Tu rostro gira demasiado a la derecha</string>
<string name="FaceTec_accessibility_feedback_face_too_far_left">Tu rostro está demasiado a la izquierda</string>
<string name="FaceTec_accessibility_feedback_face_too_far_right">Tu rostro está demasiado a la derecha</string>
<string name="FaceTec_accessibility_feedback_face_too_high">Tu rostro está demasiado arriba</string>
<string name="FaceTec_accessibility_feedback_face_too_low">Tu rostro está demasiado abajo</string>
<string name="FaceTec_accessibility_feedback_hold_device_to_eye_level">Mantenga el dispositivo a la altura de los ojos</string>
<string name="FaceTec_accessibility_feedback_move_phone_away">Tu rostro está demasiado cerca</string>
<string name="FaceTec_accessibility_feedback_move_phone_closer">Tu rostro está demasiado lejos</string>
<string name="FaceTec_accessibility_tap_guidance">Toque dos veces cualquier parte de la pantalla para ver indicaciones sobre cómo alinear el rostro.</string>
<string name="FaceTec_accessibility_torch_button">Interruptor de iluminación</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">ACEPTAR</string>
<string name="FaceTec_action_retake_photo">VOLVER</string>
<string name="FaceTec_action_scan_nfc">VOLVER A ESCANEAR</string>
<string name="FaceTec_action_scan_nfc_card">VOLVER A ESCANEAR</string>
<string name="FaceTec_action_skip_nfc">OMITIR ESTE PASO</string>
<string name="FaceTec_action_take_photo">TOMAR FOTO</string>
<string name="FaceTec_action_try_again">INTENTAR NUEVAMENTE</string>
<string name="FaceTec_camera_permission_enable_camera">HABILITAR LA CÁMARA</string>
<string name="FaceTec_camera_permission_header">Habilite la cámara</string>
<string name="FaceTec_camera_permission_launch_settings">ABRIR LA CONFIGURACIÓN</string>
<string name="FaceTec_camera_permission_message_auth">La cámara está deshabilitada. Toque a continuación para editar tu configuración.</string>
<string name="FaceTec_camera_permission_message_enroll">Por favor, toque el botón de abajo para activar tu cámara de selfis.</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">Mire hacia el frente</string>
<string name="FaceTec_feedback_face_not_upright">Mantenga la cabeza recta</string>
<string name="FaceTec_feedback_hold_steady">Mantente estable</string>
<string name="FaceTec_feedback_move_phone_away">Apártese</string>
<string name="FaceTec_feedback_move_phone_closer">Acércate</string>
<string name="FaceTec_feedback_move_phone_to_eye_level">Coloque la cámara a la altura de los ojos</string>
<string name="FaceTec_feedback_use_even_lighting">Ilumine el rostro de forma más uniforme</string>
<string name="FaceTec_idscan_additional_review_message">Se requiere\nuna verificación adicional</string>
<string name="FaceTec_idscan_capture_hold_steady_message">Mantente estable</string>
<string name="FaceTec_idscan_capture_id_back_instruction_message">Reverso de tu identificación</string>
<string name="FaceTec_idscan_capture_id_front_instruction_message">Anverso de tu identificación</string>
<string name="FaceTec_idscan_capture_tap_to_focus_message">Toque la pantalla para enfocar</string>
<string name="FaceTec_idscan_nfc_card_status_finished_with_error_message">No se puede leer\nel chip de la identificación</string>
<string name="FaceTec_idscan_nfc_card_status_ready_message">Prepárese para escanear\nel chip de tu identificación</string>
<string name="FaceTec_idscan_nfc_card_status_starting_message">Acerque el teléfono a tu identificación\npara escanear el chip NFC</string>
<string name="FaceTec_idscan_nfc_status_disabled_message">Habilite el NFC\nen la configuración de tu dispositivo\npara continuar</string>
<string name="FaceTec_idscan_nfc_status_finished_with_error_message">No se puede leer\nel chip del pasaporte electrónico</string>
<string name="FaceTec_idscan_nfc_status_finished_with_success_message">Escaneo de documentos\ncompletado</string>
<string name="FaceTec_idscan_nfc_status_ready_message">Prepárese para escanear\nel chip de tu pasaporte electrónico</string>
<string name="FaceTec_idscan_nfc_status_scanning_message">Manténgalo quieto,\nescaneando el chip NFC</string>
<string name="FaceTec_idscan_nfc_status_skipped_message">Escaneo NFC\nomitido</string>
<string name="FaceTec_idscan_nfc_status_starting_message">Acerque el teléfono a la parte\nposterior del ePasaporte\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">Revisar y confirmar</string>
<string name="FaceTec_idscan_ocr_confirmation_scroll_message">Desplácese hacia abajo</string>
<string name="FaceTec_idscan_review_id_back_instruction_message">Verifique sea nítida y legible</string>
<string name="FaceTec_idscan_review_id_front_instruction_message">Verifique sea nítida y legible</string>
<string name="FaceTec_idscan_type_selection_header">Prepárese para escanear\ntu identificación</string>
<string name="FaceTec_initializing_camera">Protegiendo la conexión</string>
<string name="FaceTec_instructions_header_ready_1">Prepárate para</string>
<string name="FaceTec_instructions_header_ready_2">tu videoselfie</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">Demasiada luz</string>
<string name="FaceTec_presession_frame_your_face">Encuadra tu rostro en el óvalo</string>
<string name="FaceTec_presession_hold_steady_1">Mantente estable durante: 1</string>
<string name="FaceTec_presession_hold_steady_2">Mantente estable durante: 2</string>
<string name="FaceTec_presession_hold_steady_3">Mantente estable durante: 3</string>
<string name="FaceTec_presession_neutral_expression">Expresión neutra, sin sonreír</string>
<string name="FaceTec_presession_position_face_straight_in_oval">Mire hacia el frente</string>
<string name="FaceTec_presession_remove_dark_glasses">Quítese los lentes oscuros</string>
<string name="FaceTec_result_facescan_upload_message">Subiendo\nel escaneo facial 3D\nencriptado</string>
<string name="FaceTec_result_idscan_retry_barcode_not_read_message">No se pudo escanear el código de barras\nInténtelo 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">La identificación\nno es totalmente visible</string>
<string name="FaceTec_result_idscan_retry_id_type_not_supported_message">No se admite este tipo de identificación\nUtilice una identificación diferente</string>
<string name="FaceTec_result_idscan_retry_ocr_results_not_good_enough_message">El texto de la identificación no es legible</string>
<string name="FaceTec_result_idscan_skip_or_error_nfc_message">Información de identificación\nsubida</string>
<string name="FaceTec_result_idscan_success_additional_review_message">Captura de la fotografía de identificación\ncompletada</string>
<string name="FaceTec_result_idscan_success_back_side_message">Escaneo de identificación completado</string>
<string name="FaceTec_result_idscan_success_back_side_nfc_next_message">Reverso de la identificación\nescaneado</string>
<string name="FaceTec_result_idscan_success_front_side_back_next_message">Anverso de la identificación\nescaneado</string>
<string name="FaceTec_result_idscan_success_front_side_message">Escaneo de identificación completado</string>
<string name="FaceTec_result_idscan_success_front_side_nfc_next_message">Anverso de la identificación\nescaneado</string>
<string name="FaceTec_result_idscan_success_nfc_message">Escaneo de identificación 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 identificación con fotografía\ncompletado</string>
<string name="FaceTec_result_idscan_unsuccess_message">La foto de la identificación\no coincide con\el rostro del usuario</string>
<string name="FaceTec_result_idscan_upload_message">Subiendo\nel escaneo de identificación\nencriptado</string>
<string name="FaceTec_result_nfc_upload_message">Subiendo\nla información NFC\nencriptada</string>
<string name="FaceTec_result_success_message">Listo</string>
<string name="FaceTec_retry_header">Intentemos de nuevo</string>
<string name="FaceTec_retry_ideal_image_label">Postura ideal</string>
<string name="FaceTec_retry_instruction_message_1">Expresión neutra, sin sonreír</string>
<string name="FaceTec_retry_instruction_message_2">Sin reflejos ni iluminación extrema</string>
<string name="FaceTec_retry_instruction_message_3">Demasiado borrosa, limpie la cámara</string>
<string name="FaceTec_retry_subheader_message">Necesitamos una videoselfie más clara</string>
<string name="FaceTec_retry_your_image_label">Tu selfie</string>
</resources>
Iniciar el Proceso de Liveness
Para iniciar el proceso de verificación de liveness, el desarrollador debe llamar a la función startLivenessActivity desde la clase DicioLivenessSdk.
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: Un token de autenticación requerido para inicializar la verificación.
- retries: El número máximo de intentos que puede hacer el usuario antes de fallar la verificación.
- playOnSound: habilita o deshabilita el sistema guiado por voz.
- urlBase: Url para la validación del token y obtención de licencias.
- Callback: Implementación de la interfaz
DicioLivenessCallbackque manejará los resultados.
Ejemplo de Uso:
private fun initDicioLivenes(){
DicioLivenessSdk.startLivenessActivity(this, token, retries, true, object : DicioLivenessCallback
{
override fun DicioLvOnSuccess(resultData: String, image: String, retries: Int) {
println("resultDataSuccess: $resultData")
println("imageFACE: $image")
println("retries: $retries")
}
override fun DicioLvResReceived(resultData: String, image: String, retries: Int) {
println("resultData: $resultData")
println("imageFACE: $image")
println("retries: $retries")
}
override fun DicioLvonFailure(errorMessage: String) {
println("errorMessage: $errorMessage")
}
override fun DicioLvonCancel(cancelMessage: String, retries: Int) {
println("cancelMessage: $cancelMessage")
println("attempts: $retries")
}
})
}
Interfaz DicioLivenessCallback
Esta interfaz maneja los resultados de la verificación de liveness.
Métodos:
- DicioLvOnSuccess:
- Descripción: Se invoca cuando la verificación de liveness es 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: Se invoca cada que se hace 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: Se invoca cuando hay un error durante el proceso.
- Parámetro:
errorMessage: Mensaje de error en formato JSON.
- DicioLvonCancel:
- Descripción: Se invoca 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 distintos tipos de errores, que son devueltos a través del 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 cancelación.
De igual manera retorna el número de intentos que se realizaron al momento de ser cancelado:
- "Retries": Número de intentos.
Manejo de errores y códigos de respuesta
El SDK devuelve diferentes códigos y mensajes de estado que te permitirán entender qué ocurrió durante la verificación.
Mensajes de éxito:
- "Prueba de vida confirmada": 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 ha fallado. |
TOKEN_NOT_VALID | El token proporcionado no es válido. |
NO_INTERNET | No hay conexión a internet disponible. |
TOKEN_EMPTY | El token está vacío o faltante. |
RETRIES_INVALID | El número de intentos debe ser mayor a 0. |
UNEXPECTED_API_RESPONSE | Respuesta inesperada desde la API. |
JSON_PARSE_ERROR | Error al analizar la respuesta JSON. |
TOKEN_NOT_VALID | Token no válido. |
Mensajes de cancelación:
| Código de cancelación | Descripción |
|---|---|
USER_CANCEL | La sesión fue cancelada exitosamente. |
MAX_RETRIES_REACHED | Se alcanzó el número máximo de reintentos permitidos. |