# Android

**BCC Finger** es una biblioteca de Android diseñada para integrarse en una aplicación Android. Esencialmente, abrirá una cámara y capturará huellas dactilares con fines biométricos.

Este Manual se actualizó para BCC Finger Photo Android versión 5.2.0.

## Requisitos

**BCC Finger Photo** es una biblioteca de Android y debe importarse en el proyecto de destino.

* Versión mínima de Android: *Android 6.0 (SDK 23), "Marshmallow"*.
* Versión mínima de kotlin: 1.6.0.
* El dispositivo móvil debe tener una cámara.
* La aplicación nativa debe estar compilada con tecnología Android.
* Entorno de desarrollo: se requiere un IDE de Android, como [Android Studio](https://developer.android.com/studio) (recomendado)
* Dependencias externas adicionales:
  * [Lottie](https://lottiefiles.com), versión 3.0.0

## Instalación

### Añadir la biblioteca en el proyecto de la aplicación

La biblioteca BCC Finger Photo requiere JNA para Android. Ambas son proporcionadas por Griaule como **.aar** archivos.

Para añadir las bibliotecas, vaya al directorio de su proyecto, abra la carpeta **app** y cree los siguientes directorios `libs/bccfinger`. Luego, añada las dependencias `jna.aar` y `bccfingerphotolib-release.aar` . La estructura de carpetas debe ser similar a esta:

![](/files/b099835d71163c471bfe724765400818a3d0cf1c)

El siguiente paso es hacer que estos archivos sean visibles para las dependencias de gradle. Para ello, añada la siguiente línea en el archivo `build.gradle (:app)` en el objeto dependencies:

```groovy
dependencies {
	[...]
	implementation fileTree(dir: 'libs/bccfinger', include: ['*.aar'])
}
```

Dentro del `build.gradle (:app)` archivo, añada también las opciones de compilación y establezca Source Compatibility y Target Compatibility para usar Java 17:

```groovy
compileOptions {
	sourceCompatibility JavaVersion.VERSION_17
	targetCompatibility JavaVersion.VERSION_17
}
```

### Configuración de todas las dependencias

Realice los cambios siguientes en el archivo `android/app/build.gradle`:

```groovy
dependencies {
	// SUS DEPENDENCIAS //
	// ...

	// BCC FINGER //
	implementation fileTree(dir: 'libs/bccfinger', include:['*.aar'])

	// ANDROIDX //
	implementation 'androidx.appcompat:appcompat:1.7.0'
	implementation 'androidx.constraintlayout:constraintlayout:2.1.4'

	// LOTTIE //
	implementation 'com.airbnb.android:lottie:3.0.0'

	// CAMERA X //
	def camerax_version = "1.5.1"
	// Biblioteca core de CameraX usando implementación camera2
	implementation "androidx.camera:camera-camera2:$camerax_version"
	// Biblioteca Lifecycle de CameraX
	implementation "androidx.camera:camera-lifecycle:$camerax_version"
	// Clase View de CameraX
	implementation "androidx.camera:camera-view:$camerax_version"

	// MATERIAL
	implementation 'com.google.android.material:material:1.6.1'
}
```

## Uso

### Parámetros y constructor

A continuación se muestra un ejemplo sencillo de uso de la biblioteca:

```kotlin
// Para iniciar una nueva captura
BCCFingerBuilder(this, this).initializeCapture()
```

La clase `BCCFingerBuilder` recibe los siguientes parámetros:

* `context: Context` - El contexto de la aplicación.
* `delegate: BCCFingerDelegate` - Interfaz responsable de notificar eventos de captura (por ejemplo, fallo o éxito).

La clase `BCCFingerBuilder` es responsable de gestionar la configuración de uso de `BCCFinger`. Se aceptan los siguientes parámetros para configurar la captura biométrica y el comportamiento del software:

* `setSkipCaptureOption(enable: Boolean)` - Habilita la opción de omitir la captura actual.
* `setDebugMode(enable: Boolean)` - Habilita el modo de depuración.
* `buildCaptureType(type: BCCFingerPhotoCaptureType)` - Define el tipo de captura de huellas dactilares. Las opciones son:

  ```kotlin
  enum class BCCFingerPhotoCaptureType {
  	BOTH_HANDS,
  	ONLY_LEFT_HAND,
  	ONLY_RIGHT_HAND,
  	THUMBS,
  	LEFT_THUMB,
  	RIGHT_THUMB,
  	FULL_HANDS,
  	FULL_LEFT_HAND,
  	FULL_RIGHT_HAND;
  }
  ```

  * `BOTH_HANDS` - Ambas manos sin pulgares.
  * `ONLY_LEFT_HAND` - Solo la mano izquierda, sin pulgares.
  * `ONLY_RIGHT_HAND` - Solo la mano derecha, sin pulgares.
  * `THUMBS` - Ambos pulgares.
  * `LEFT_THUMB` - Solo el pulgar izquierdo.
  * `RIGHT_THUMB` - Solo el pulgar derecho.
  * `FULL_HANDS` - Ambas manos con pulgares.
  * `FULL_LEFT_HAND` - Solo la mano izquierda, con pulgar.
  * `FULL_RIGHT_HAND` - Solo la mano derecha, con pulgar.
* `buildBeginDelaySeconds(delay: Float)` - Define el retardo para iniciar el ajuste automático del umbral.
* `buildThreshold(maxQuality: Int, minQuality: Int, totalTime: Float, stepCount: Int)` – Define los parámetros del umbral.
* `setInstructionEnable(enable: Boolean)` – Cuando se establece en `true`, habilita la pantalla de instrucciones (valor predeterminado: `false`).

Como referencia, la lista completa de parámetros y valores predeterminados es:

```kotlin
skipsHandOption: Boolean = false
debugMode: Boolean = false
beginDelaySeconds: Float = 2f
maxQuality: Int = 50
minQuality: Int = 0
totalTime: Float = 20f
stepCount: Int = 20
captureType: BCCFingerPhotoCaptureType = BCCFingerPhotoCaptureType.FULL_HANDS
shouldShowInstruction: Boolean = true
var shouldIntercalateInstructions: Boolean = true
var activityResults: FingerCaptureActivityResults? = null
```

### Valores de retorno

Los resultados de la última captura de huellas dactilares se pueden obtener mediante el método `fingerCaptureDidFinish` de la interfaz `BCCFingerDelegate` :

```kotlin
fun fingerCaptureDidFinish(
	returnData: BCCFingerReturnData,
	analytics: BCCFingerReturnAnalytics
)
```

La clase `returnData` el objeto contiene los siguientes métodos para la recuperación de datos:

* `getCapturedFingersIndexes()` - Devuelve una lista con el índice de todas las huellas dactilares capturadas:

  ```kotlin
  enum class BCCFingerIndex(val index: Int) {
  	leftLittle(0),
  	leftRing(1),
  	leftMiddle(2),
  	leftIndex(3),
  	leftThumbs(4),
  	rightThumbs(5),
  	rightIndex(6),
  	rightMiddle(7),
  	rightRing(8),
  	rightLittle(9);
  }
  ```
* `getCapturedFingers()` - Devuelve un mapa que relaciona los índices de los dedos con las biometrías capturadas.
* `getCapturedFingersData()` - Devuelve la lista de todas las huellas dactilares capturadas:

  ```kotlin
  data class BCCFingerData(
  	var fingerprintImage: Bitmap,
  	var wsqAsBase64: String?
  )
  ```

  * `fingerprintImage` - Imagen PNG de la huella dactilar en escala de grises.
  * `wsqAsBase64` - Imagen WSQ de la huella dactilar codificada en base64.
* `getSkippedFingers()` - Devuelve la lista de índices de todas las capturas de dedos omitidas.

La clase `BCCFingerReturnData` la clase también contiene atributos que almacenan la información de la captura agrupada por mano:

```kotlin
class BCCFingerReturnData {
	val leftHand: BCCHandData?
	val rightHand: BCCHandData?
}
```

Estos atributos pueden ser nulos cuando no se solicitan capturas para ninguna de las manos.

La clase `HandData` la clase contiene la siguiente información:

```kotlin
var capturedFingers = mutableMapOf<BCCFingerIndex, BCCFingerData>()
private set

var skippedFingers = mutableListOf<BCCFingerIndex>()
private set

var handsPhoto: Bitmap? = null
private set

var thumbsPhoto: Bitmap? = null
private set
```

* `capturedFingers` - Mapa que relaciona el índice del dedo con la imagen de la huella dactilar.
* `skippedFingers` - Lista de índices de todas las capturas de dedos omitidas.
* `handsPhoto` - Foto original de la mano de la que se extrajeron las huellas dactilares.
* `thumbPhoto` - Foto original del pulgar.

Si el usuario cancela la captura, cerrándola antes de capturar las biometrías, se llamará al método `fingerCaptureDidAbort` . Puede implementar este método para tratar este escenario.

#### Obtención de imágenes originales

Es posible obtener las imágenes originales a través de la clase `BCCFingerReturnData` , como se muestra a continuación:

```kotlin
val leftSlapPhoto = returnData.leftHand?.handsPhoto
val rightSlapPhoto = returnData.rightHand?.handsPhoto
val leftThumbPhoto = returnData.leftHand?.thumbsPhoto
val rightThumbPhoto = returnData.rightHand?.handsPhoto
```

### Proyecto de ejemplo

Este es un proyecto de ejemplo funcional para una captura de huellas dactilares usando BCC Mobile Finger Android:

```kotlin
package com.example.bccfignerexample

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.bccfignerexample.databinding.ActivityMainBinding
import com.griaule.bccfingerphotolib.analytics.BCCFingerReturnAnalytics
import com.griaule.bccfingerphotolib.fingerApi.declaration.BCCFingerBuilder
import com.griaule.bccfingerphotolib.fingerApi.declaration.BCCFingerDelegate
import com.griaule.bccfingerphotolib.fingerApi.returnData.BCCFingerReturnData


class MainActivity : AppCompatActivity(), BCCFingerDelegate {

	private lateinit var binding: ActivityMainBinding

	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)

		binding = ActivityMainBinding.inflate(layoutInflater)
		setContentView(binding.root)

		setupListeners()
	}

	private fun setupListeners() {
		binding.startCaptureButton.setOnClickListener { startCapture() }
	}

	private fun startCapture() {
		BCCFingerBuilder(this, this).initializeCapture()
	}

	override fun fingerCaptureDidAbort(
		analytics: BCCFingerReturnAnalytics
	) {
		// ...
	}

	override fun fingerCaptureDidFinish(
		returnData: BCCFingerReturnData,
		analytics: BCCFingerReturnAnalytics
	) {
		// ...
	}

}
```

## Instrucciones del agente: consulta de esta documentación <a href="#agent-instructions-querying-this-documentation" id="agent-instructions-querying-this-documentation"></a>

Si necesita información adicional que no esté disponible directamente en esta página, puede consultar la documentación dinámicamente haciendo una pregunta.

Realice una solicitud HTTP GET en la URL de la página actual con el parámetro de consulta `ask` :

```
GET https://docs.griaule.com/sdks/bcc-finger/bccmobilefingerandroid.md?ask=<question>
```

La pregunta debe ser específica, autónoma y estar escrita en lenguaje natural. La respuesta contendrá una respuesta directa a la pregunta y extractos y fuentes relevantes de la documentación.

Utilice este mecanismo cuando la respuesta no esté explícitamente presente en la página actual, necesite aclaración o contexto adicional, o desee recuperar secciones relacionadas de la documentación.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.griaule.com/sdks/es/bcc-finger/bccmobilefingerandroid.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
