2012-06-17 16 views
8

Estoy tratando de escribir una aplicación simple para interactuar con etiquetas NFC, pero no puedo hacer que mi teléfono haga nada más que activar la aplicación de etiqueta NFC predeterminada. Realmente solo quiero poder interceptar cualquier etiqueta que escanee, determinar si contiene algunos datos y actuar en consecuencia.Android Intenciones NFC no están comenzando mi actividad

Ahora mismo mi archivo de manifiesto parece

<uses-sdk android:minSdkVersion="10" /> 
<uses-feature android:name="android.hardware.nfc" android:required="true"/> 
<uses-permission android:name="android.permission.NFC"/> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".NfcActivity" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
     </intent-filter> 
    </activity> 
</application> 

Sin embargo cuando se escanea una etiqueta NFC, no vuelvo a ver el inicio de actividad. ¿Me estoy perdiendo de algo? Traté de colocar el filtro de intención dentro de un BroadcastReceiver y tampoco tuve suerte ...

Respuesta

21

No puede iniciar su aplicación con todas las etiquetas NFC que escanea. Android determinará cuál es la aplicación más adecuada en función de cuán específico es el filtro de intención. Sin embargo, si su aplicación se ejecuta en primer plano, puede usar NFC foreground dispatch para captar todas las intenciones de NFC.

En onCreate() complemento:

mAdapter = NfcAdapter.getDefaultAdapter(this); 
PendingIntent pendingIntent = PendingIntent.getActivity(
    this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

En onResume() complemento:

mAdapter.enableForegroundDispatch(this, pendingIntent, null, null); 

En onPause() complemento:

mAdapter.disableForegroundDispatch(this); 

En onNewIntent se puede obtener en la etiqueta NFC así:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
+0

¿Por qué demonios no puede recibir todos los eventos NFC en un solo lugar? – FlyingStreudel

+1

La idea de NFC es que puede hacer cosas tales como realizar automáticamente la acción apropiada en su teléfono. Algunos ejemplos: abra una URL en su navegador, regístrese en Foursquare, conéctese automáticamente con una red WiFi. Android determina a qué aplicación reenviar el intento de NFC en función de los filtros de intención de las aplicaciones. El filtro más específico "gana". Si se encuentra más de una coincidencia, se le presenta un selector de aplicaciones al usuario. Hay una excepción: despacho en primer plano NFC, donde la aplicación que se ejecuta en primer plano puede solicitar obtener todos los intentos de NFC de un tipo específico. –

+0

Supongo que no entiendo por qué esta fue la funcionalidad elegida, a diferencia de los SMS, donde la intención puede ser recogido y retransmitido por cualquier número de receptores. Parece tonto que te limites a realizar solo una acción en una interacción con tecnología NFC. – FlyingStreudel

6

Los documentos SDK muestran esto como un ejemplo básico.

<intent-filter> 
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="text/plain" /> 
</intent-filter> 
+0

Observe el elemento 'category' en el ejemplo anterior. Es realmente necesario (aunque el nombre "DEFAULT" sugiere lo contrario). –

+0

¿me puede mostrar a quién puedo lanzar diferentes actividades basadas en diferentes etiquetas NFC? tag1/prod/234 o tag3/buyme/3422. Si hay productos, quiero activar una actividad ProductionInfo, pero con buyme me gustaría poner en una lista, – Karoly

0

Android choses automáticamente la aplicación más relevante para manejar la etiqueta NFC escaneada. Debe ser más específico en su intent-filter, es decir, solo escuche las etiquetas de texto, las etiquetas de URL o las etiquetas de CONTACTO. Esto puede hacerse especificando más el filtro, usando, su ejemplo, <data android:mimeType="text/plain" /> para TEXT-Tags. De lo contrario, se activará la aplicación predeterminada NFC-Tag.

1

Está esperando que las etiquetas se definan en formato NDEF. Por lo tanto, su programa solo se lanzará si las etiquetas que se leen están en formato NDEF.

Puede probar filtros de intención más genéricos como TAG_DISCOVERED o TECH_DISCOVERED.

Cuestiones relacionadas