¿Es posible iniciar una aplicación cuando se escanea una etiqueta NFC?

Tengo una etiqueta NFC. Quiero escribir una aplicación de Android que se inicie automáticamente y obtenga datos de NFC cuando se escanea la etiqueta NFC con el teléfono.

Esto debería funcionar asumiendo que el dispositivo tiene NFC activado y que no hay otras aplicaciones en ejecución en el teléfono. He encontrado algunas aplicaciones que pueden iniciar otra aplicación, pero mi aplicación debe funcionar sin una aplicación adicional que se ejecuta en segundo plano.

¿Hay alguna manera de resolver esta tarea?

Para que su aplicación ( actividad en realidad) se inicie al escanear una etiqueta, debe agregar un filtro de intenciones adecuado al manifiesto de la aplicación.

Si desea iniciar su aplicación para cualquier etiqueta, el filtro de intenciones TECH_DISCOVERED es lo que desea utilizar:

 <activity ...> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> </activity> 

Este filtro de intenciones requiere un archivo de recursos XML adicional que defina las tecnologías de etiquetas que su aplicación debe escuchar (observe la etiqueta <meta-data ... /> fuera del filtro de intenciones). Las tecnologías disponibles son las del espacio de nombres android.nfc.tech.* , Actualmente:

  • android.nfc.tech.IsoDep
  • android.nfc.tech.MifareClassic
  • android.nfc.tech.MifareUltralight
  • android.nfc.tech.Ndef
  • android.nfc.tech.NdefFormatable
  • android.nfc.tech.NfcA
  • android.nfc.tech.NfcB
  • android.nfc.tech.NfcBarcode
  • android.nfc.tech.NfcF
  • android.nfc.tech.NfcV

Para descubrir cualquier etiqueta, crearía un archivo XML como este (cree el archivo como xml/nfc_tech_filter.xml ):

 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcA</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcB</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcBarcode</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcF</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcV</tech> </tech-list> </resources> 

Tenga en cuenta que usted no necesita necesariamente incluir las otras tecnologías como

  • IsoDep implica NfcA o NfcB ,
  • MifareClassic implica NfcA ,
  • MifareUltralight implica NfcA , y
  • Ndef / NdefFormatable implica NfcA , NfcB , NfcF o NfcV .

El filtro de intenciones anterior se activará si no hay otra aplicación que tenga un filtro de intenciones de coincidencia mejor. Una mejor coincidencia sería una coincidencia para el tipo de datos utilizado en la etiqueta. Por ejemplo, si su etiqueta contiene una URL (encapsulada en un mensaje NDEF), una aplicación que se activa en las URL obtendrá precedencia sobre su aplicación. Si conoce los tipos de datos utilizados en las etiquetas, también puede agregar un filtro para esos tipos de datos. Por ejemplo, para hacer coincidir cualquier URL "http: //" y "https: //", puede utilizar:

 <activity ...> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> <data android:scheme="https" /> </intent-filter> </activity> 

De forma similar, si su etiqueta contiene el tipo MIME "application / vnd.com.example", podría utilizar:

 <activity ...> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.com.example" /> </intent-filter> </activity> 

Incluso podría combinar filtros de intenciones múltiples para una actividad:

 <activity ...> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> <data android:scheme="https" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.com.example" /> </intent-filter> </activity> 

Finalmente, hay un filtro de intenciones más relacionado con NFC:

 <intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> 

Sin embargo, normalmente no utilizaría este filtro de intenciones en el manifiesto. Se entiende como un fall-back solamente y se disparará siempre si no hay ninguna otra aplicación que dispara en la tecnología o los datos de la etiqueta escaneada. Por lo tanto, no hay necesidad de agregar este filtro de intenciones de usted ya disparador para el filtro de intención TECH_DISCOVERED antes mencionado.

Agregue el siguiente intent-filter a su etiqueta de activity principal en el archivo AndroidManifest.xml .

 <!-- main activity --> <activity ...> ... <intent-filter> <action android-name="android.nfc.action.TAG_DISCOVERED" /> <category android-name="android.nfc.category.DEFAULT" /> </intent-filter> ... </activity> 

Ahora, cuando toque su etiqueta NFC en su teléfono, su aplicación será llamada y ejecutada.

  • Emulación de etiquetas RFID en el emulador de Android
  • Android nfcA.connect (), nfcA.transceive (), nfcA.setTimeout () y nfcA.getMaxTransceiveLength ()
  • NFC API para Android NDK
  • ¿Qué tan bien soporta la API NFC de Android Mifare Desfire?
  • Emulación de tarjeta de host en Android (4.4 / KitKat y superior) con Nexus 5
  • Acaba de leer una etiqueta NFC
  • ¿Existen teléfonos Android que admitan APDUs ampliadas?
  • Habilitación de CardEmulation en Android ICS con NFC_EXTRAS
  • Comunicación P2P NFC entre Galaxy S3 y ACR122
  • La detección de etiquetas NFC no llama aNewIntent y está iniciando desde la actividad principal
  • Escribir en una tarjeta emulada Android HCE (emulación de la tarjeta Host)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.