Archived post from my old blog (2007–2016), restored from the Wayback Machine. It is published as written at the time, in Italian; tools and versions are likely out of date.
NFC: Intent Filter
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
← Archive