UI Biometría Facial - ReconoSERID/SDK-ReconoSERID-Android GitHub Wiki

Interfaz gráfica para los servicios de Biometría Facial.

Biometría Facial

Valida que haya un rostro humano y realice movimientos aleatorios (sonria, parpadear, gire a la derecha o a la izquierda)

Dependiendo del tipo de convenio ciertos parametros son obligatorios enviar en el intent

  • Para tipo 0:

     1.  Se debe enviar como llave "guid_ciudadano" acompañado del guidCiudadano
    
  • Para tipo 3:

     1.  Se debe enviar como llave "type_document" acompañado del tipo de documento
    
     2.  Se debe enviar como llave "num_document" acompañado del número documento
    
+ Igualmente para la version 2_3_0_2 e inferiores se debe usar LivePreviewActivity.class, mientras que para la version 3.0.0 y superiores se debe usar BiometricReaderActivity.class

Primer método

#!java

PreferencesSave.INSTANCE.setSavePhoto("1");       
static final int FACE = 3;

        //Intent intent = new Intent(this, LivePreviewActivity.class);   // para versiones 2_3_0_2 e inferiores usar LivePreviewActivity.class
        Intent intent = new Intent(this, BiometricReaderActivity.class); // para versiones 3.0.0 y superiores usar BiometricReaderActivity.class

        intent.putExtra(IntentExtras.GUID_CIUDADANO, "xxxxx-xxxxx-xxxxx-xxxxx"); //Obligatorio para convenio 0
        intent.putExtra(IntentExtras.TYPE_DOCUMENT, "CC");        //Obligatorio para convenio 0 y 3 
        intent.putExtra(IntentExtras.NUM_DOCUMENT, "123456789");  //Obligatorio para convenio 0 y 3
        intent.putExtra(IntentExtras.SAVE_USER, "xxxx");     //Obligatorio para convenio
        intent.putExtra(IntentExtras.VALIDATE_FACE, false);  //Opcional, si se desea enviar en false    
        intent.putExtra(IntentExtras.ACTIVATE_FLASH, false); //Activa el flash de la cámara (si lo tiene), por default esta apagado (false)
        intent.putExtra(IntentExtras.CHANGE_CAMERA, false);  //Cambia de la cámara delantera a la trasera, por default esta la cámara delantera activada
        intent.putExtra(IntentExtras.ADVISER, "Asesor Android"); //Obligatorio para convenio 0 y 3 
        intent.putExtra(IntentExtras.CAMPUS, "Sede Android");    //Obligatorio para convenio 0 y 3  
        intent.putExtra(IntentExtras.TIME, 5);    //Tiempo ejecución entre retos. Enviar el valor que se necesite, por defecto, esta 5 seg  
        startActivityForResult(intent, FACE); 
#!Kotlin

   const val FACE = 3
        //val intent = Intent(this, LivePreviewActivity.class)   // para versiones 2_3_0_2 e inferiores usar LivePreviewActivity.class
        val intent = new Intent(this, BiometricReaderActivity.class); // para versiones 3.0.0 y superiores usar BiometricReaderActivity.class
        intent.putExtra(IntentExtras.GUID_CIUDADANO, "xxxxx-xxxxx-xxxxx-xxxxx") //Obligatorio para convenio 0
        intent.putExtra(IntentExtras.TYPE_DOCUMENT, "CC")        //Obligatorio para convenio 0 y 3
        intent.putExtra(IntentExtras.NUM_DOCUMENT, "123456789")  //Obligatorio para convenio 0 y 3
        intent.putExtra(IntentExtras.SAVE_USER, "xxxx")     //Obligatorio para convenio   
        intent.putExtra(IntentExtras.VALIDATE_FACE, false)  //Opcional, si se desea enviar en false 
        intent.putExtra(IntentExtras.ACTIVATE_FLASH, false) //Activa el flash de la cámara (si lo tiene), por default esta apagado (false)
        intent.putExtra(IntentExtras.CHANGE_CAMERA, false)  //Cambia de la cámara delantera a la trasera, por default esta la cámara delantera activada
        intent.putExtra(IntentExtras.ADVISER, "Asesor Android") //Obligatorio para convenio 0 y 3 
        intent.putExtra(IntentExtras.CAMPUS, "Sede Android")    //Obligatorio para convenio 0 y 3 
        intent.putExtra(IntentExtras.TIME, 5);    //Tiempo ejecución entre retos. Enviar el valor que se necesite, por defecto, esta 5 seg  
        startActivityForResult(intent, FACE)

se devuelve en el onActivityResult

+ para la version 2_3_0_2 e inferiores en el resultado trae un solo path en el "IntentExtras.PATH_FILE_PHOTO_R" mientras que para la version 3.0.0 y superiores en el resultado trae dos path en el "IntentExtras.PATH_FILE_PHOTO_R" (una captura del rostro cerca y otra lejos)
#!java

 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);     
        if (requestCode == FACE){
            if (resultCode == RESULT_OK){ 
                // para versiones 2_3_0_2 e inferiores usar           
                String pathFront = data.getStringExtra(IntentExtras.PATH_FILE_PHOTO_R);    //path foto tomada
                // para versiones 3.0.0 y superiores usar
                String[] pathFace1 = (data != null ? data.getStringArrayExtra(IntentExtras.PATH_FILE_PHOTO_R) : new String[0] );            
                boolean isValidateFace = data.getStringExtra(IntentExtras.VALIDATE_FACE); //si enviaste true en el intent IntentExtras.VALIDATE_FACE
            }else if (resultCode == IntentExtras.ERROR_INTENT){
                data.getStringExtra(IntentExtras.ERROR_MSG);             //mensaje de error
                data.getExtras().getParcelable(IntentExtras.ERROR_SDK);  //errores generados en el SDK
            }
        } 
    }
#!Kotlin

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == FACE){
            if (resultCode == RESULT_OK){
                val isValidateFace: String? =  data.getStringExtra(IntentExtras.VALIDATE_FACE) //si enviaste true en el intent IntentExtras.VALIDATE_FACE

                // para versiones 2_3_0_2 e inferiores usar  
                val pathFace: String? = data.getStringExtra(IntentExtras.PATH_FILE_PHOTO_R)  //path de la imagen tomada
                // para versiones 3.0.0 y superiores usar
                val images = getImagesFromIntent(data, IntentExtras.PATH_FILE_PHOTO_R)
                if (images.isNotEmpty()) {
                    pathFaceFar = images.first() //primer imagen, lejos
                    if (images.count() > 1) {
                    pathFaceNear = images[1]    // Segunda imagen, cerca
                    }
                }               
            } else if (resultCode == IntentExtras.ERROR_INTENT){
                data.extras!!.getStringExtra(IntentExtras.ERROR_MSG)!!      //mensaje de error
                data.extras!!.getParcelable(IntentExtras.ERROR_SDK)!!       //errores generados en el SDK
            }
        } 
    }

private fun getImagesFromIntent(data: Intent?, key: String): List<String> {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            data?.getSerializableExtra(key, ArrayList::class.java)?.let { images ->
                return images.map { it as String }
            } ?: kotlin.run {
                return emptyList()
            }
        } else {
            data?.getStringArrayListExtra(key)?.let { images ->
                return images
            } ?: kotlin.run {
                return emptyList()
            }
        }
    }

Segundo método

#!java

private ActivityResultLauncher<Intent> faceLauncher;
PreferencesSave.INSTANCE.setSavePhoto("1");       
static final int FACE = 3;

        //Intent intent = new Intent(this, LivePreviewActivity.class);   // para versiones 2_3_0_2 e inferiores usar LivePreviewActivity.class
        Intent intent = new Intent(this, BiometricReaderActivity.class); // para versiones 3.0.0 y superiores usar BiometricReaderActivity.class

        intent.putExtra(IntentExtras.GUID_CIUDADANO, "xxxxx-xxxxx-xxxxx-xxxxx"); //Obligatorio para convenio 0
        intent.putExtra(IntentExtras.TYPE_DOCUMENT, "CC");        //Obligatorio para convenio 0 y 3 
        intent.putExtra(IntentExtras.NUM_DOCUMENT, "123456789");  //Obligatorio para convenio 0 y 3
        intent.putExtra(IntentExtras.SAVE_USER, "xxxx");     //Obligatorio para convenio
        intent.putExtra(IntentExtras.VALIDATE_FACE, false);  //Opcional, si se desea enviar en false    
        intent.putExtra(IntentExtras.ACTIVATE_FLASH, false); //Activa el flash de la cámara (si lo tiene), por default esta apagado (false)
        intent.putExtra(IntentExtras.CHANGE_CAMERA, false);  //Cambia de la cámara delantera a la trasera, por default esta la cámara delantera activada
        intent.putExtra(IntentExtras.ADVISER, "Asesor Android"); //Obligatorio para convenio 0 y 3 
        intent.putExtra(IntentExtras.CAMPUS, "Sede Android");    //Obligatorio para convenio 0 y 3  
        intent.putExtra(IntentExtras.TIME, 5);    //Tiempo ejecución entre retos. Enviar el valor que se necesite, por defecto, esta 5 seg  
        faceLauncher.launch(intent);
#!Kotlin

   const val FACE = 3
        //val intent = Intent(this, LivePreviewActivity.class)   // para versiones 2_3_0_2 e inferiores usar LivePreviewActivity.class
        val intent = new Intent(this, BiometricReaderActivity.class); // para versiones 3.0.0 y superiores usar BiometricReaderActivity.class
        intent.putExtra(IntentExtras.GUID_CIUDADANO, "xxxxx-xxxxx-xxxxx-xxxxx") //Obligatorio para convenio 0
        intent.putExtra(IntentExtras.TYPE_DOCUMENT, "CC")        //Obligatorio para convenio 0 y 3
        intent.putExtra(IntentExtras.NUM_DOCUMENT, "123456789")  //Obligatorio para convenio 0 y 3
        intent.putExtra(IntentExtras.SAVE_USER, "xxxx")     //Obligatorio para convenio   
        intent.putExtra(IntentExtras.VALIDATE_FACE, false)  //Opcional, si se desea enviar en false 
        intent.putExtra(IntentExtras.ACTIVATE_FLASH, false) //Activa el flash de la cámara (si lo tiene), por default esta apagado (false)
        intent.putExtra(IntentExtras.CHANGE_CAMERA, false)  //Cambia de la cámara delantera a la trasera, por default esta la cámara delantera activada
        intent.putExtra(IntentExtras.ADVISER, "Asesor Android") //Obligatorio para convenio 0 y 3 
        intent.putExtra(IntentExtras.CAMPUS, "Sede Android")    //Obligatorio para convenio 0 y 3 
        intent.putExtra(IntentExtras.TIME, 5)    //Tiempo ejecución entre retos. Enviar el valor que se necesite, por defecto, esta 5 seg  
        faceLauncher.launch(intent)

El resultado se devuelve en el launcher

+ para la version 2_3_0_2 e inferiores en el resultado trae un solo path en el "IntentExtras.PATH_FILE_PHOTO_R" mientras que para la version 3.0.0 y superiores en el resultado trae dos path en el "IntentExtras.PATH_FILE_PHOTO_R" (una captura del rostro cerca y otra lejos)
#!java

 faceLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == RESULT_CANCELED) {
                        //Resultado cancelado
                    }else if (result.getResultCode() == RESULT_OK) {
                         // para versiones 2_3_0_2 e inferiores usar           
                         String pathFront = data.getStringExtra(IntentExtras.PATH_FILE_PHOTO_R);    //path foto tomada
                         // para versiones 3.0.0 y superiores usar
                         String[] pathFace1 = getImagesFromIntent(data, IntentExtras.PATH_FILE_PHOTO_R);       //paths de la imágenes tomadas         
                         boolean isValidateFace = data.getStringExtra(IntentExtras.VALIDATE_FACE); //si enviaste true en el intent IntentExtras.VALIDATE_FACE
                    }else if (result.getResultCode() == IntentExtras.ERROR_INTENT) {
                        data.getStringExtra(IntentExtras.ERROR_MSG);             //mensaje de error
                        data.getExtras().getParcelable(IntentExtras.ERROR_SDK);  //errores generados en el SDK          
                    }
                }
        );


public List<String> getImagesFromIntent(Intent data, String key) {
        if (data == null) {
            return new ArrayList<>();
        }

        ArrayList<String> images;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            images = data.getSerializableExtra(key, ArrayList.class);
        } else {
            images = data.getStringArrayListExtra(key);
        }
        return images != null ? images : new ArrayList<>();
    }
 
#!Kotlin

 private val faceLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        val data = result.data
        if (result.resultCode == RESULT_CANCELED) {
            //Resultado cancelado
        }else if (result.resultCode == RESULT_OK && data != null) {
                val isValidateFace: String? =  data.getStringExtra(IntentExtras.VALIDATE_FACE) //si enviaste true en el intent 
                IntentExtras.VALIDATE_FACE

                // para versiones 2_3_0_2 e inferiores usar  
                val pathFace: String? = data.getStringExtra(IntentExtras.PATH_FILE_PHOTO_R)  //path de la imagen tomada
                // para versiones 3.0.0 y superiores usar
                val images = getImagesFromIntent(data, IntentExtras.PATH_FILE_PHOTO_R)       //paths de la imágenes tomadas
               
                }               
        } else if (result.resultCode == IntentExtras.ERROR_INTENT && data != null) {
                data.extras!!.getStringExtra(IntentExtras.ERROR_MSG)!!      //mensaje de error
                data.extras!!.getParcelable(IntentExtras.ERROR_SDK)!!       //errores generados en el SDK
        }
    }

private fun getImagesFromIntent(data: Intent?, key: String): List<String> {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            data?.getSerializableExtra(key, ArrayList::class.java)?.let { images ->
                return images.map { it as String }
            } ?: kotlin.run {
                return emptyList()
            }
        } else {
            data?.getStringArrayListExtra(key)?.let { images ->
                return images
            } ?: kotlin.run {
                return emptyList()
            }
        }
    }

Para saber más sobre los errores de lectura que puede entregar el SDK en caso de error, verificar el siguiente enlace:

Códigos de Error

volver

⚠️ **GitHub.com Fallback** ⚠️