2012-06-17 16 views
8

Sto provando a scrivere una semplice applicazione per interagire con i tag NFC, ma non riesco a far sì che il mio telefono faccia qualsiasi cosa, ma attiva l'app di tag NFC predefinita. Voglio solo essere in grado di intercettare qualsiasi tag che scruto, determinare se contiene alcuni dati e agire di conseguenza.Android NFC Intents non sta iniziando la mia attività

questo momento il mio file manifesto sembra

<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> 

Tuttavia durante la scansione di un tag NFC, non vedo mai l'inizio attività. Mi sto perdendo qualcosa qui? Ho provato a inserire il filtro intent all'interno di un BroadcastReceiver e non ho avuto fortuna ...

risposta

21

Non è possibile avviare l'app da tutti i tag NFC sottoposti a scansione. Android determinerà quale sia l'app più adatta in base al grado di specificità del filtro intent. Tuttavia, se l'app è in esecuzione in primo piano, è possibile utilizzare NFC foreground dispatch per catturare tutti gli intenti NFC.

In onCreate() aggiuntivo:

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

In onResume() aggiuntivo:

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

In onPause() aggiuntivo:

mAdapter.disableForegroundDispatch(this); 

In onNewIntent si possono ottenere presso il tag NFC in questo modo:

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

Perché mai non puoi ricevere tutti gli eventi NFC in un posto ... – FlyingStreudel

+1

L'idea di NFC è che può fare cose come eseguire automaticamente l'azione appropriata sul telefono. Alcuni esempi: aprire un URL nel browser, effettuare il check-in su Foursquare, connettersi automaticamente con una rete Wi-Fi. Android determina quale app inoltrare l'intento di NFC in base ai filtri di intento delle app. Il filtro più specifico "vince". Se viene trovata più di una corrispondenza, viene selezionato un selettore di app per l'utente. Esiste un'eccezione: l'invio in primo piano NFC, in cui l'app in esecuzione in primo piano può richiedere di ottenere tutti gli intenti NFC di un tipo specifico. –

+0

Immagino che non capisco perché questa fosse la funzionalità scelta, a differenza di SMS in cui l'intento è in grado di essere rilevato e ritrasmesso da un numero qualsiasi di ricevitori. Sembra sciocco che tu sia limitato a prendere solo un'azione per un'interazione con la tecnologia NFC. – FlyingStreudel

6

I documenti SDK mostrano questo come un esempio di base.

<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

Nota l'elemento 'category' nell'esempio sopra. È davvero necessario (anche se il nome "DEFAULT" suggerisce diversamente). –

+0

puoi mostrarmi chi posso lanciare attivazioni diverse basate su diversi tag NFC? tag1/prod/234 o tag3/buyme/3422. Se c'è un pungolo, voglio lanciare un'attività ProductionInfo, ma con buimo vorrei inserire un elenco, – Karoly

0

Android sceglie automaticamente l'applicazione più rilevante per gestire il tag NFC digitalizzata. Devi essere più specifico nel tuo intent-filter, ad esempio solo ascoltare tag TEXT, tag URL o tag CONTACT. Questo può essere fatto specificando ulteriormente il filtro, usando, il tuo esempio, <data android:mimeType="text/plain" /> per Tag TEXT. In caso contrario, verrà attivata l'app NFC-Tag predefinita.

1

Si prevede che i tag vengano definiti nel formato NDEF. Quindi il tuo programma verrà lanciato solo se i tag che vengono letti sono in formato NDEF.

È possibile provare più filtri di intenti generici come TAG_DISCOVERED o TECH_DISCOVERED.

Problemi correlati