Face-Detector SDK

El Face-Detector SDK permite realizar el reconocimiento facial en tiempo real, lo que es clave para validar la identidad de una persona en el proceso de KYC. Este SDK utiliza algoritmos avanzados de detección facial biométrica garantizando la verificación de la persona. A través de este componente, se obtiene un alto nivel de seguridad en la autenticación de la identidad visual, previniendo fraudes o suplantaciones.


Objetivo

Obtener archivos base64 de tipo Rostro, ya sea tomando una foto o video directamente desde la cámara del dispositivo o desde el almacenamiento del dispositivo Android.

Funcionalidades

El SDK proporciona funcionalidades para:

  • Tomar una foto con la cámara del dispositivo Android y devolver un archivo base64.
  • Grabar un video con la cámara del dispositivo Android y devolver un archivo base64.
  • Recuperar una imagen desde el almacenamiento del dispositivo Android y devolver un archivo base64.
  • Recuperar un video desde el almacenamiento del dispositivo Android y devolver un archivo base64.

Empezando

Antes de integrar el SDK en tu proyecto, asegúrate de cumplir con los siguientes requisitos:

  • Android Studio: Tener instalada la versión recomendada de Iguana de Android Studio.
  • Gradle: Usar la versión recomendada de Gradle 8.4.
  • Android Gradle Plugin: Tener la versión recomendada del plugin de Gradle 8.3.2.
  • Compilación del SDK: Configurar la compilación con SDK 35.
  • Compatibilidad de Source y Target: Utilizar las versiones recomendadas de source y target compatibility 18.
  • minSdkVersion: Establecer la versión mínima del SDK en 26.
  • targetSdkVersion: Configurar la versión del SDK objetivo en 33.
  • Groovy DS: La configuración del build gradle, debe de estar en Groovy DSL.

Implementación

1. Crear una aplicación

Al crear un proyecto debe de elegirse como No Activity y en la opción de build Configuration Language se debe de elegir: Groovy DSL (build,gradle)

2. Configurar build.gradle

Remplaza el contenido de build.gradle del proyecto por:

buildscript {
    ext.kotlin_version = "1.9.22"
    ext.hilt_version = '2.46'
    repositories {
        google()
        mavenCentral()
        maven {
            url 'https://us-maven.pkg.dev/jaak-platform/jaak-android'
        }
        maven {
            url 'https://jitpack.io'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:8.3.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
        classpath 'com.google.gms:google-services:4.4.2'
    }
}
tasks.register('clean', Delete) {
    delete rootProject.buildDir
}

3. Configurar Settings.gradle

Remplaza en el archivo settings.gradle el siguiente bloque de dependencyResolutionManagement:\

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
      maven {
            url 'https://us-maven.pkg.dev/jaak-platform/jaak-android'
        }
		}
}

4. Configurar build.gradle de app

Remplaza la sección de plugins en el archivo build.gradle de app

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}

Remplaza la sección de dependencias en el archivo build.gradle de app

dependencies {
    //Código previo
    //..
    //.
// Bibliotecas de Kotlin
implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version")
// Android Jetpack
implementation("androidx.core:core-ktx:1.15.0")
implementation("androidx.appcompat:appcompat:1.7.0")
implementation("androidx.fragment:fragment-ktx:1.8.5")
implementation("androidx.activity:activity-ktx:1.9.3")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7")
implementation("androidx.constraintlayout:constraintlayout:2.2.0")
implementation 'com.google.android.material:material:1.12.0'

// Inyección de Dependencias
implementation("com.google.dagger:hilt-android:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
// jaakdocumentdetector
implementation("com.jaak.facedetector:jaakfacedetector-sdk:2.0.5")
}

Agrega el siguiente bloque en Android en el archivo build.gradle de app

android {
    //Código previo
    //..
    //.
    buildFeatures{
        viewBinding = true
    }
}

5. Crea una clase de tipo Application

Crea una clase kotlin que extienda de Application y agrega la anotación de HiltAndroidApp

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class TestApp : Application()

6. Crea una clase kotlin

Crea una clase kotlin con la anotación @AndroidEntryPoint, que extienda de AppCompatActivity() e implementa el listener FaceDetectorListener

Ejemplo de ActivityNota: Este ejemplo utiliza viewBinding por lo que se debe de crear un layout donde el nombre es como se armara la clase binding.

Ejemplo: layout: activity_main.xml --> El nombre del binding se llamaría ActivityMainBindingEjemplo 2: layout: main_activity.xml --> El nombre del binding se llamaría MainActivityBinding

class MainActivity : AppCompatActivity(), FaceDetectorListener {

    private lateinit var binding: MainActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = MainActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }

    override fun onSuccessFaceDetector(typeProcess: Int, uri: Uri?) {
    }
    
    override fun onErrorFaceDetector(text: String) {
    }

Crea una xml para utilizar los viewBinding

Nota: Al crear el xml se debe de agregar la línea:xmlns:tools="http://schemas.android.com/tools" y la línea: tools:context="nombre_clase_kotlin"

Ejemplo 1: tools:context="com.example.test.MainActivity"
Ejemplo 2: tools:context="com.example.test.ActivityMain"

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.test.MainActivity">

</androidx.constraintlayout.widget.ConstraintLayout>

7. Configura AndroidManifest

Agrega los permisos al archivo AndroidManifest

<manifest...>
      //Código previo
    		//..
   		  //..
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
          tools:replace="android:maxSdkVersion"
          android:maxSdkVersion="28"/>   
</manifest>  

Agrega las siguientes líneas a application para agregar nuestra App previamente creada, además de unas excepciones

 <application
        //Código previo
    		//..
   		  //..
        android:name="com.example.test.TestApp"
        tools:replace="android:theme,android:name">

Agrega la actividad principal que se creó previamente

<application ..>
      //Código previo
    		//..
   		  //..
        <activity android:name="com.example.test.MainActivity"
            android:exported="true"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

Crearemos un archivo en res/xml/file_paths.xml que contendrá la ruta donde queremos que almacene los videos:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Ruta para acceder a archivos en el directorio de archivos externos privados de la aplicación -->
    <external-path name="my_images" path="Pictures/" />
    <external-path name="my_files" path="Android/data/nombre-de-tu-paquete/files/nombre-de-tu-root-name/" />
</paths>

Aqui está un ejemplo de su llenado:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Ruta para acceder a archivos en el directorio de archivos externos privados de la aplicación -->
    <external-path name="my_images" path="Pictures/" />
    <external-path name="my_files" path="Android/data/com.example.test/files/Test/" />
</paths>

Agregaremos el file provider al Manifest:

Nota: en android:authorities debe de ir el nombre del paquete del proyecto:Ejemplo 1: android:authorities="com.example.jaakfacedetectorsdk" Ejemplo 2: android:authorities="com.example.test"

<application ..>
  //Código previo
    //..
    //..
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.test"
            android:exported="false"
            android:grantUriPermissions="true"
            tools:replace="android:authorities">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>  
</application>

8. Implementa Face Detector SDK

Implementa la librería de face detector sdk:

private lateinit var faceDetectorSDK: FaceDetectorSDK

Agregue su configuración::

private fun configFaceDetectorSDK(){
        faceDetectorSDK = FaceDetectorSDK(this,this)
        faceDetectorSDK.setEnableCamera(true)
        faceDetectorSDK.setEnableDisk(true)
        faceDetectorSDK.setEnableCameraPhoto(true)
        faceDetectorSDK.setEnableCameraVideo(true)
        faceDetectorSDK.setEnableDiskPhoto(true)
        faceDetectorSDK.setEnableDiskVideo(true)
        faceDetectorSDK.setEnableDiskImageVideo(true)
        faceDetectorSDK.setFacesOrDocuments(true)
        faceDetectorSDK.setEnableModelFaces(true)
        faceDetectorSDK.setImageFormat("image/*")
        faceDetectorSDK.setVideoFormat("video/*")
        faceDetectorSDK.setImageSize(3)
        faceDetectorSDK.setVideoSize(10)
    }

Ejecutar el SDK:

Nota: Si se quiere tener el menú de obtener video por cámara o por almacenamiento, se manda 0.Si se quiere solo obtener video por cámara se manda 2 y si solo por almacenamiento se manda 4

faceDetectorSDK.startFaceDetector(0)

9. Obtener imágenes y procesalos

Obtener las imágenes y convertirlos en base64

En los métodos override del listener FaceDetectorListener, al ser correcto, este devuelve la ubicación del video y para no llenar la memoria al manejar base64 se tiene el siguiente ejemplo para obtener el video:

 override fun onSuccessFaceDetector(typeProcess: Int, uri: Uri?) {
        var base64Proccess = ""
        when (typeProcess) {
            2 -> {
                base64Proccess = Utils.videoCameraUriToBase64(uri!!)!!
            }
            4 -> {
                base64Proccess = Utils.videoFileUriToBase64(contentResolver, uri!!)!!
            }
        }
        Log.e("base64",uri.toString())
    }

El integrador decide cómo proceder con las imágenes en base64

Ejemplo de Código

📦

Repositorio de ejemplo

Contamos con un ejemplo en nuestro repositorio GitHub donde podrás ver un ejemplo de la implementación.
Face Detector SDK para Android. https://github.com/jaak-ai/jaak-face-detector-sdk