> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/nfc-wallet-sdk-android/es/help/knowledge-base/control-nfc-payments-on-android.md).

# Controla los pagos NFC en Android

## Resumen

La configuración del sistema de Android puede bloquear los pagos sin contacto, incluso cuando tu **aplicación de cartera digital** es correcta.

Esta página cubre los controles de Android que afectan a los pagos NFC, además de los requisitos del lado de la app para admitirlos.

## Configuración del dispositivo que afecta a los pagos NFC

### Interruptor de NFC

Android proporciona un interruptor maestro de NFC, similar al Wi‑Fi o a los datos móviles.

NFC debe estar habilitado para ejecutar pagos sin contacto. Los usuarios finales también pueden deshabilitar NFC para bloquear los pagos.

<figure><img src="/files/a0d6f2ee55c24f2b9ef747d22a27eb3885deb36c" alt=""><figcaption><p>Ejemplo: interruptor de NFC en Configuración rápida</p></figcaption></figure>

### Requerir desbloqueo del dispositivo (Android 12+)

En algunos dispositivos (Android 12+), NFC se puede configurar para que funcione solo cuando el dispositivo esté desbloqueado.

Si está habilitado, el usuario final debe desbloquear el dispositivo antes de acercarlo.

<figure><img src="/files/a06f43a8cccc9287a49d42fc123b722db5e70b9a" alt=""><figcaption><p>Ejemplo: opción para requerir un dispositivo desbloqueado para NFC</p></figcaption></figure>

### Selección de la fuente de la aplicación (específica del OEM)

Algunos dispositivos admiten varias “ubicaciones de pago” (por ejemplo, elemento seguro vs HCE).

El hardware del dispositivo enruta los comandos NFC entrantes a la ubicación seleccionada.

<div data-with-frame="true"><figure><img src="/files/7eb3322821f6237e96df9fea02bc61a1a40e995a" alt=""><figcaption><p>Ejemplo: selección de la fuente de la aplicación para pagos sin contacto</p></figcaption></figure></div>

{% hint style="info" %}
El SDK de NFC Wallet usa emulación de tarjeta basada en host (HCE).

Si el dispositivo expone una configuración de fuente de la aplicación, indica a los usuarios finales que seleccionen una opción equivalente a **HCE Wallet**.
{% endhint %}

### Aplicación de pago predeterminada

Android permite al usuario final elegir la aplicación de pago predeterminada para Tap & Pay.

<figure><img src="/files/6a3049d43804817f30cd9e1aee079628599ea8a4" alt=""><figcaption><p>Ejemplo: configuración de la aplicación de pago predeterminada</p></figcaption></figure>

{% hint style="info" %}
Algunos dispositivos también muestran un interruptor como **Pagar con la app abierta actualmente**.

Esto requiere compatibilidad del lado de la app. Consulta [Compatibilidad con “Pagar con la app abierta actualmente”](#support-pay-with-currently-open-app).
{% endhint %}

## Requisitos de la aplicación de billetera digital (HCE)

Tu **aplicación de cartera digital** debe declarar un servicio HCE.

El SDK de NFC Wallet no declara por ti el servicio HCE. Proporciona `AbstractHCEService` para simplificar la implementación.

Para más información, consulta [Descripción general de la emulación de tarjeta basada en host](https://developer.android.com/guide/topics/connectivity/nfc/hce).

### Detectar y solicitar la aplicación de pago predeterminada

Al iniciar, se recomienda:

* Comprobar si tu servicio HCE es el predeterminado, usando [CardEmulation#isDefaultServiceForCategory](https://developer.android.com/reference/android/nfc/cardemulation/CardEmulation#isDefaultServiceForCategory\(android.content.ComponentName,%20java.lang.String\)).
* Si no lo es, pide al usuario final que establezca tu app como el servicio de pago predeterminado iniciando [CardEmulation#ACTION\_CHANGE\_DEFAULT](https://developer.android.com/reference/android/nfc/cardemulation/CardEmulation#ACTION_CHANGE_DEFAULT).

```java
Intent intentSetDefaultTapNPay = new Intent();
intentSetDefaultTapNPay.setAction(ACTION_CHANGE_DEFAULT);
intentSetDefaultTapNPay.putExtra(EXTRA_SERVICE_COMPONENT, new ComponentName(this, CANONICAL_PAYMENT_SERVICENAME));
intentSetDefaultTapNPay.putExtra(EXTRA_CATEGORY, CATEGORY_PAYMENT);
startActivity(intentSetDefaultTapNPay);
```

Android muestra un diálogo del sistema. No puedes cambiar su texto, excepto la etiqueta de tu app.

<figure><img src="/files/d02dd219fc4326b677651293f2a766eefe20cf1d" alt=""><figcaption><p>Ejemplo: diálogo de Android para cambiar la app de pago predeterminada</p></figcaption></figure>

Para observar la elección del usuario, llama a `startActivityForResult` y comprueba el resultado en `onActivityResult`:

```java
private void checkAndSetTapNPayDefault() {
  // ...
  startActivityForResult(intentSetDefaultTapNPay, REQ_CODE_TAP_N_PAY_SET_DEFAULT);
}

@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
  if (requestCode == REQ_CODE_TAP_N_PAY_SET_DEFAULT) {
    if (resultCode == RESULT_OK) {
      // el usuario seleccionó 'Reemplazar'
    } else {
      // el usuario seleccionó 'No'
    }
  }
}
```

### Controla cómo aparece tu app en la configuración de Android

La interfaz de usuario de Tap & Pay / Pagos sin contacto varía según el OEM, el modelo y la versión de Android.

<figure><img src="/files/31e081b01bc8fe535a19f0552848166f4c30198a" alt=""><figcaption><p>Ejemplo: diferencias de la interfaz de usuario de Tap &#x26; Pay entre dispositivos</p></figcaption></figure>

Android completa la entrada de tu aplicación utilizando recursos de:

* `AndroidManifest.xml`
* Recurso de metadatos de tu servicio de pago (declarado mediante `/manifest/application/service/meta-data/@android:resource`)

Puedes controlar:

* **Icono de la aplicación**: `/manifest/application/@android:icon`
* **Banner del servicio de pago**: metadatos del servicio de pago, `/host-apdu-service/@android:apduServiceBanner`
* **Etiqueta del servicio de pago**: `/manifest/application/service/@android:label`
  * Esta etiqueta también se usa en el diálogo “establecer app de pago predeterminada”.
* **Descripción del servicio de pago**: metadatos del servicio de pago, `/host-apdu-service/@android:description`

No puedes controlar el orden de las aplicaciones en la lista.

### Pagar con la app en primer plano

Algunos dispositivos muestran una configuración como **Pagar con la app abierta actualmente** o **Priorizar la app que se está ejecutando actualmente**.

Esta configuración solo significa que el usuario final permite que las apps en primer plano anulen el servicio de pago predeterminado. No impone ese comportamiento.

Para aprovecharlo, implementa [CardEmulation#setPreferredService](https://developer.android.com/reference/android/nfc/cardemulation/CardEmulation#setPreferredService\(android.app.Activity,%20android.content.ComponentName\)) y [CardEmulation#unsetPreferredService](https://developer.android.com/reference/android/nfc/cardemulation/CardEmulation#unsetPreferredService\(android.app.Activity\)) siguiendo las directrices de Android.

{% hint style="info" %}
El `Activity` pasado a `setPreferredService(...)` debe estar en estado reanudado.

Llamar a `setPreferredService(...)` en [Activity#onResume](https://developer.android.com/reference/android/app/Activity#onResume\(\)).

Llamar a `unsetPreferredService(...)` en [Activity#onPause](https://developer.android.com/reference/android/app/Activity#onPause\(\)).

Use [CardEmulation#categoryAllowsForegroundPreference](https://developer.android.com/reference/android/nfc/cardemulation/CardEmulation#categoryAllowsForegroundPreference\(java.lang.String\)) para detectar si se permite la preferencia en primer plano para la categoría de pago.
{% endhint %}

Recomendaciones:

* Comprueba que la preferencia en primer plano esté habilitada usando `CardEmulation.categoryAllowsForegroundPreference(CATEGORY_PAYMENT)`.
* Implementa la anulación de la aplicación predeterminada como se explicó antes.
* Advierte a los usuarios finales sobre una experiencia de pago inconsistente si tu aplicación de billetera digital solo maneja transacciones sin contacto cuando está en primer plano.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.payments.thalescloud.io/nfc-wallet-sdk-android/es/help/knowledge-base/control-nfc-payments-on-android.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
