> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/sdk-mobile/android-sdk/componentes-modulos/captura-de-nfc.md).

# Captura de NFC

## Introducción <a href="#id-1-introduccion" id="id-1-introduccion"></a>

La captura facial se realiza con el ***NFC Component***.

Este componente se encarga de realizar la lectura del NFC de los documentos de identidad y pasaportes. Sus principales procesos son:

* Gestión interna del sensor de NFC.
* Gestión de permisos.
* Análisis de documento.
* Análisis del progreso.
* Asistente en los procesos de lectura.
* Devolución de toda la información posible a leer
* Devolución de imágenes cuando estén disponible para su lectura

En el apartado de [Lanzamiento simplificado](/sdks/sdk-mobile/android-sdk/inicializacion/lanzamiento-simplificado.md) se detallan los pasos necesarios para la integración básica del SDK. En esta sección se añade la información para el lanzamiento de este componente.

## Dependencia <a href="#id-2-dependencia" id="id-2-dependencia"></a>

La dependencia específica del componente es:

```kts
implementation "com.facephi.androidsdk:nfc_component:$sdk_nfc_component_version"{
      exclude group : "org.bouncycastle", module : "bcprov-jdk15on"
      exclude group : "org.bouncycastle", module : "jetified-bcprov-jdk15on-1.68"
  }
```

Además habrá que añadir en gradle:

```kts
android {
  ...
 packaging {
      resources {
          pickFirsts.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF")
      }
  }
}
```

## Controladores disponibles

| **Controlador** | **Descripción**                      |
| --------------- | ------------------------------------ |
| NFCController   | Controlador principal de lectura NFC |

## Lanzamiento simplificado <a href="#id-4-lanzamiento-simplificado" id="id-4-lanzamiento-simplificado"></a>

Una vez iniciado el SDK y creada una nueva operación se podrá lanzar el componente. Se podrá hacer uso de cualquiera de sus controladores para ejecutar su funcionalidad.

Lanzamiento de la captura:

<pre class="language-kotlin"><code class="lang-kotlin"><strong>val response = SDKController.launch(
</strong><strong>    NfcController(
</strong>        componentData = NfcConfigurationData(...),
        state = { state ->
            Napier.d("NFC: State: ${state.name}")
        },
        debugLogs = {
            Napier.d("NFC Logs: $it")
        }
    )
)
when (response) {
    is SdkResult.Error -> Napier.d("NFC: ERROR - ${response.error.name}")
    is SdkResult.Success -> response.data
}
</code></pre>

## Configuración básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lanzar el componente actual, se deberá crear un objeto *NFCConfigurationData* que será la configuración del controlador del componente.

La configuración básica necesaria para es la siguiente:

```kotlin
NfcConfigurationData(
    documentNumber = NFC_SUPPORT_NUMBER, // Num soport.
    birthDate = NFC_BIRTH_DATE, // "dd/MM/yyyy"
    expirationDate = NFC_EXPIRATION_DATE, // "dd/MM/yyyy",
)
```

Los datos necesarios son los del documento que se va a capturar.

## Recepción del resultado <a href="#id-6-recepcion-del-resultado" id="id-6-recepcion-del-resultado"></a>

El lanzamiento devolverá la información en formato SdkResult. Pudiendo diferenciarse entre un lanzamiento correcto y uno incorrecto:

```kotlin
when (response) {
    is SdkResult.Error -> Napier.d("ERROR - ${response.error}")
    is SdkResult.Success -> response.data
}
```

### Recepción de errores <a href="#id-61-recepcion-de-errores" id="id-61-recepcion-de-errores"></a>

Los errores se devolverán como un objeto 'NfcError'.

Listado de errores:

* NFC\_APPLICATION\_CONTEXT\_ERROR: El contexto de aplicación necesario es nulo.
* NFC\_CANCEL\_BY\_USER: El usuario ha cancelado el proceso.
* NFC\_CANCEL\_LAUNCH: Se ha hecho una cancelación general del SDK.
* NFC\_COMPONENT\_LICENSE\_ERROR: La licencia del componente no es correcta.
* NFC\_EMPTY\_LICENSE: El String de licencia está vacío.
* NFC\_EXTRACT\_DATA\_ERROR: Error en los datos extraídos.
* NFC\_FETCH\_DATA\_ERROR: Error en la recogida del resultado.
* NFC\_FLOW\_ERROR: Error en el proceso de flow.
* NFC\_INITIALIZATION\_ERROR: Error de inicialización.
* NFC\_LAST\_COMMAND\_EXPECTED: Error en el comando de finalización
* NFC\_MANAGER\_NOT\_INITIALIZED: Los managers son nulos.
* NFC\_NO\_DATA\_ERROR: Los datos de entrada son nulos o no se ha recibido resultado de la lectura.
* NFC\_ERROR: Error general
* NFC\_ERROR\_DATA: Error en los datos de entrada
* NFC\_ERROR\_DISABLED: NFC deshabilitado
* NFC\_ERROR\_ILLEGAL\_ARGUMENT: NFC con un tag incorrecto
* NFC\_ERROR\_IO: Error de entrada/salida
* NFC\_ERROR\_NOT\_SUPPORTED: NFC no soportado
* NFC\_ERROR\_TAG\_LOST: Conexión perdida
* NFC\_OPERATION\_NOT\_CREATED: No hay ninguna operación en curso.
* NFC\_TIMEOUT: Timeout en el proceso.

### Recepción del resultado correcto - *data* <a href="#id-62-recepcion-del-resultado-correcto-data" id="id-62-recepcion-del-resultado-correcto-data"></a>

En la parte de SdkResult.Success - *data*, dispondremos de la clase *NfcResult*.

El resultado devuelve las imágenes en formato **SdkImage**, es posible extraer el bitmap accediendo a *image.bitmap*. Si se quisiera convertir a base64 se puede utilizar la función:

`Base64.encodeToString(this.toByteArray(), Base64.NO_WRAP)`

{% hint style="info" %}
Los campos cifrados en el resultado se incorporan a partir de la versión 2.6.0
{% endhint %}

Los campos devueltos en el resultado son los siguientes:

**nfcRawData**

Información obtenida por cada tipo de dato en formato crudo.

**nfcDocumentInformation**

Información obtenida del documento ordenada por:

* documentNumber
* expirationDate
* issuer
* mrzString
* type

**nfcPersonalInformation**

Información obtenida del documento ordenada por:

* address
* birthdate
* city
* gender
* name
* nationality
* personalNumber
* placeOfBirth
* surname

**nfcImages**

Información de imágenes obtenida del documento ordenada por:

* facialImage
* fingerprintImage
* signatureImage
* tokenFacialImage
* tokenSignatureImage

**nfcSecurityData**

Información de datos de seguridad del documento ordenada por:

* dataGroupsHashes
* dataGroupsRead
* documentSigningCertificateData
* issuerSigningCertificateData
* ldsVersion

**nfcValidations**

Información de las validaciones del documento ordenada por:

* accessType
* activeAuthenticationSupported
* activeAuthenticationValidation
* chipAuthenticationSupported
* chipAuthenticationValidation
* dataGroupsHashesValidation
* documentSigningValidation
* issuerSigningValidation

**tokenOcr**

Datos del OCR cifrados

## Información avanzada <a href="#id-7-informacion-avanzada" id="id-7-informacion-avanzada"></a>

Este apartado amplía la información del componente.

### Configuración avanzada del componente <a href="#id-71-configuracion-avanzada-del-componente" id="id-71-configuracion-avanzada-del-componente"></a>

Para lanzar el componente actual, se deberá crear un objeto *NFCConfigurationData* que será la configuración del controlador del componente.

A continuación se detallan todos los campos que forman parte de esta clase.

**documentNumber**

Indica el número de documento o número de soporte dependiendo del documento a realizar la lectura.

Éste campo es obligatorio.

**birthDate**

Indica la fecha de nacimiento que aparece en el documento ("dd/MM/yyyy").

Éste campo es obligatorio.

**expirationDate**

Indica la fecha de expiración que aparece en el documento ("dd/MM/yyyy").

Éste campo es obligatorio.

**extractionTimeout**

Establece el tiempo máximo que se puede realizar la lectura.

**showReadingScreen**

Establece si se desea mostrar la pantalla modal inferior con la lectura que se está realizando. Si se desactiva, no se muestra ninguna vista y se deberán escuchar los estados que devuelve el controlador.

**showTutorial**

Indica si el componente activa la pantalla de tutorial. En esta vista se explica de forma intuitiva cómo se realiza la captura.

**vibrationEnabled**

Indica si se desea un feedback de vibración al acabar el proceso.

**skipPace**

Indica que solo se desea realizar la lectura BAC de NFC. Es una lectura con información más simple y rápida que permite la lectura de más variedad de documentos.

**showDiagnostic**

Mostrar pantallas de diagnóstico al final del proceso

**extractFacialImage**

Indica si quiere extraer la imagen de la cara.

**extractSignatureImage**

Indica si quiere extraer la imagen de la firma.

**documentType**

Campo utilizado para cambiar la vista de tutorial y que muestre los diferentes documentos.

**showPreviousTip**

Muestra una pantalla previa al lanzamiento de la captura con información sobre el proceso a realizar y un botón para el lanzamiento.

**readingProgressStyle**

Cambio de estilo en la pantalla de lectura de documento:

* ReadingProgressStyle.DOTS: El progreso viene marcado visualmente con puntos
* ReadingProgressStyle.PERCENTAGE: El progreso se muestra con un porcentaje

***

## Personalización del componente <a href="#id-8-personalizacion-del-componente" id="id-8-personalizacion-del-componente"></a>

Aparte de los cambios que se pueden realizar a nivel de SDK (los cuales se explican en el documento de [Personalización del SDK](/sdks/sdk-mobile/android-sdk/personalizacion.md)), este componente en concreto permite la modificación de su interfaz.

### Textos <a href="#id-81-textos" id="id-81-textos"></a>

Los textos pueden personalizarse añadiendo un fichero XML de recursos en la aplicación cliente y sobrescribiendo los valores por defecto.

```kotlin
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="nfc_widget_previous_tip_title_passport">NFC Reader</string>
    <string name="nfc_widget_previous_tip_title_id">NFC Reader</string>
    <string name="nfc_widget_previous_tip_description">&lt;b&gt;Attach&lt;/b&gt; the document to the back of your device.</string>
    <string name="nfc_widget_start_button">Start</string>
    <string name="nfc_widget_tutorial_button">Check out these tips</string>
    <string name="nfc_widget_close_button">Close</string>
    <string name="nfc_widget_info_button">More information</string>
    <string name="nfc_widget_previous_tip_animation_desc">NFC previous tips</string>
    <string name="nfc_widget_mandatory_tutorial_title">NFC Reader</string>
    <string name="nfc_widget_tutorial_tip_1">When we pass a card through a sensor, there is an exchange of information called NFC.</string>
    <string name="nfc_widget_tutorial_tip_2">On your mobile, the sensor is in the marked area. Here you must gather your document.</string>
    <string name="nfc_widget_tutorial_tip_3_passport">Keep &lt;b&gt; closed &lt;/b&gt; the passport to do the reading.</string>
    <string name="nfc_widget_tutorial_tip_3_id">For a better reading, remove the cover of your mobile.</string>
    <string name="nfc_widget_ready_to_scan">Ready to scan</string>
    <string name="nfc_widget_reading_device">Reading device</string>
    <string name="nfc_widget_start_message">Attach the chip to your mobile.\nWhen it detects it, hold it still.</string>
    <string name="nfc_widget_reading_message">Hold the position.</string>
    <string name="nfc_widget_reading_document_message">Extracting document data.</string>
    <string name="nfc_widget_reading_images_message">Extracting images.</string>
    <string name="nfc_widget_close_alt">Close process</string>
    <string name="nfc_widget_reading_title">Reading NFC chip</string>
    <string name="nfc_widget_reading_animation_desc">NFC reading animation</string>
    <string name="nfc_widget_cancel_button">Cancel</string>
    <string name="nfc_widget_success_title">Reading finished</string>
    <string name="nfc_widget_success_document_prefix">Document:</string>
    <string name="nfc_widget_success_animation_desc">Reading completed</string>
    <string name="nfc_widget_error_title">Reading incomplete</string>
    <string name="nfc_widget_error_animation_desc">Reading cancelled</string>
    <string name="nfc_widget_retry_button">Retry</string>
    <string name="nfc_widget_close_action">Close</string>
    <string name="nfc_widget_cancelled_title">NFC flow cancelled</string>
    <string name="nfc_widget_cancelled_desc">Close the view to continue.</string>
    <string name="nfc_widget_cancelled_animation_desc">NFC flow cancelled</string>
    <string name="nfc_widget_timeout_title">Follow the instructions</string>
    <string name="nfc_widget_timeout_desc">Join the document &lt;b&gt;after&lt;/b&gt; clicking on the &lt;b&gt;Start button.&lt;/b&gt;</string>
    <string name="nfc_widget_tag_lost_title">Reading not finished</string>
    <string name="nfc_widget_tag_lost_desc">Hold the position until the end of the reading</string>
    <string name="nfc_widget_data_error_title">Document could not be read</string>
    <string name="nfc_widget_data_error_desc">Review the data entered</string>
    <string name="nfc_widget_internal_error_title">There was a technical problem</string>
    <string name="nfc_widget_internal_error_desc">We apologize. The capture could not be made</string>
    <string name="nfc_widget_state_waiting_for_tag">Slide the document until the sensor detects it.</string>
    <string name="nfc_widget_state_preparing">Preparing chip reading...</string>
    <string name="nfc_widget_state_secure_access">Validating secure document access...</string>
    <string name="nfc_widget_state_reading_data">Reading document data...</string>
    <string name="nfc_widget_state_reading_images">Reading document images...</string>
    <string name="nfc_widget_state_io_error">A communication issue with NFC was detected.</string>
    <string name="nfc_widget_state_finished">Reading completed.</string>
</resources>

```

### Animaciones <a href="#id-82-animaciones" id="id-82-animaciones"></a>

Si se desea modificar las animaciones (lottie) de la SDK habría que incluir las animaciones con el mismo nombre en la carpeta res/raw/ de la aplicación.

```
nfc_anim_reader.json
nfc_anim_tuto_1.json
nfc_anim_tuto_2.json
nfc_anim_tuto_3.json
nfc_anim_tuto_3_pass.json
nfc_anim_tuto_id.json
nfc_anim_tuto_passport.json
```

### Vistas externas <a href="#id-83-vistas-externas" id="id-83-vistas-externas"></a>

Es posible modificar las pantallas inferiores de lectura del componente manteniendo su funcionalidad y navegación. A partir de la versión 2.8.0 la personalización externa queda limitada a las bottom sheets de lectura; las vistas legacy de tip previo y diagnóstico ya no forman parte del contrato público. Para ello deben implementarse los interfaces siguientes:

Pantallas del diálogo de lectura:

```kotlin

interface INfcWaitingBottomView {
    @Composable
    fun Content(
        onClose: () -> Unit,
    )
}

```

```kotlin

interface INfcReadingBottomView {
    @Composable
    fun Content(
        state: NfcReadState,
        onClose: () -> Unit
    )
}

```

```kotlin

interface INfcSuccessBottomView {
    @Composable
    fun Content(
        onContinue: () -> Unit,
    )
}

```

```kotlin

interface INfcErrorBottomView {
    @Composable
    fun Content(
        error: NfcError,
        onContinue: () -> Unit,
    )
}

```

Una vez creadas las clases que implementan los interfaces, en el lanzamiento del componente se podrá añadir el parámetro "customViews" para que se utilicen en el SDK.
