Skip to main content

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

LenguajeVersión AndroidVersión SDKAndroid Studio
Kotlin/JavaAndroid 7+24+Jellyfish+
  1. Permisos en el Manifest: Asegúrate de agregar los siguientes permisos en tu archivo AndroidManifest.xml:
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. Configuración del Proyecto: Añade las siguientes dependencias en tu archivo build.gradle:
build.gradle
implementation(libs.okhttp3)
implementation(files("libs/face-9.6.81.aar"))
implementation(files("libs/sdkliveness.aar"))
  1. libs.versions.toml:
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.

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 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 DicioLivenessCallback que 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:

  1. 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.
  1. 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.
  1. DicioLvonFailure:
  • Descripción: Se invoca cuando hay un error durante el proceso.
  • Parámetro:
    • errorMessage: Mensaje de error en formato JSON.
  1. 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 errorDescripción
NETWORK_ERRORError de red durante la solicitud.
SESSION_TOKEN_ERRORError al recuperar el token de sesión.
SDK_INITIALIZATION_FAILEDLa inicialización del SDK ha fallado.
TOKEN_NOT_VALIDEl token proporcionado no es válido.
NO_INTERNETNo hay conexión a internet disponible.
TOKEN_EMPTYEl token está vacío o faltante.
RETRIES_INVALIDEl número de intentos debe ser mayor a 0.
UNEXPECTED_API_RESPONSERespuesta inesperada desde la API.
JSON_PARSE_ERRORError al analizar la respuesta JSON.
TOKEN_NOT_VALIDToken no válido.

Mensajes de cancelación:

Código de cancelaciónDescripción
USER_CANCELLa sesión fue cancelada exitosamente.
MAX_RETRIES_REACHEDSe alcanzó el número máximo de reintentos permitidos.