NFC: Intent Filter

ottobre 23, 2012
By

Sto giochicchiando con le feature NFC di Android e ho messo in piedi una semplice app che fa partire un file mp3 quando viene letto un tag che contiene un certo testo all’interno di un messaggio NDEF

Di base serve agire sul Manifest come al solito

In questo caso serve aggiungere:

<uses-sdk
 android:minSdkVersion="10"
 android:targetSdkVersion="15" />
 <uses-permission android:name="android.permission.WAKE_LOCK"/>
 <uses-permission android:name="android.permission.VIBRATE"/>
 <uses-permission android:name="android.permission.NFC" />
<application
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >
 <activity
 android:name=".MyActivity"
 android:label="@string/title_activity" >
 <intent-filter>
 <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
 <category android:name="android.intent.category.DEFAULT"/>
 <data android:mimeType="text/plain" />
 </intent-filter>
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>
 </application>

notare le permission che vanno chieste.

Nel mio caso volevo mimare una chiamata entrante, quindi ho chiesto anche la Vibrate

Da notare anche che non sto chiedendo di filtrare solo per certe tecnologie (sarebbe il tag meta dell’action) dato che vorrei che l’app rispondesse a qualsiasi tipo di tag, anche programmato dall’utente finale

L’unico scoglio che rimane per ora è che l’antenna dell’NFC viene spenta quando il device va in sleep, quindi l’effetto che cercavo (fingere una chiamata semplicemente toccando il tag NFC) va un po’ a perdersi.

Ci sono sistemi per tenere sveglia l’antenna dell’NFC anche al lock, ma per il momento necessitano di modifiche alle ROM del device, quindi non sono una strada praticabile

Una volta ricevuto l’intent l’app controlla che nel message ci sia il testo che fa scattare il playback

Parcelable[] rawMsgs = intent
 .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
 msgs = new NdefMessage[rawMsgs.length];
 for (int i = 0; i < rawMsgs.length; i++) {
  msgs[i] = (NdefMessage) rawMsgs[i];
 }
}
for (NdefMessage msg : msgs) {
 NdefRecord[] recs = msg.getRecords();
  for (NdefRecord r : recs) {
   if (new String(r.getPayload()).contains(TRIGGER_STRING)) {
   playTune(null);
   return;
   }
  }
 }

Il prossimo step è cercare di filtrare la TRIGGER_STRING direttamente a livello di intent-filter

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


*