UI Biometría Facial - ReconoSERID/SDK-ReconoSERID-Android GitHub Wiki
Interfaz gráfica para los servicios de 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
#!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()
}
}
}
#!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: