Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 46 di 97
  • livello avanzato
Indice lezioni

NFC

Sfruttare la compatibilità di Android con la tecnologia NFC, ormai sempre più spesso integrata negli smartphone moderni.
Sfruttare la compatibilità di Android con la tecnologia NFC, ormai sempre più spesso integrata negli smartphone moderni.
Link copiato negli appunti

NFC, letteralmente Near Field Communication ("comunicazione a corto raggio"), è una tecnologia a radiofrequenza che permette di identificare oggetti e
scambiare dati a distanza molto ravvicinata, solitamente ad un massimo di 4 cm anche se il valore teorico raggiunge i 10.

Il dialogo si verifica al momento dell'avvicinamento tra i due attori:

  • l'initiator, tipicamente un dispositivo evoluto come uno smartphone o un tablet, dotato delle necessarie API per l'interazione in NFC;
  • il target, un elemento molto semplice su cui generalmente vengono scritti o letti dati, a volte denominato tag.

Ciò che rende particolarmente accattivante questa tecnologia è che i target sono di dimensioni molto ridotte, piuttosto economici e riescono quasi a
scomparire alla vista celandosi in oggetti minuscoli come etichette, smartcard e portachiavi. Uno dei fattori che permette il possesso di queste
caratteristiche è l'assenza di alimentazione. Infatti i tag NFC sono passivi: vengono cioè alimentati mediante il campo elettromagnetico indotto dall'initiator
al momento dell'avvicinamento. Questo, di converso, è la principale ragione del perchè la distanza di utilizzo si riduce a pochi centimetri.

Le modalità di funzionamento dei dispositivi che supportano NFC sono tre:

  • Peer Mode: i dispositivi scambiano dati dialogando "alla pari" ossia con ruoli equivalenti;
  • Reader/Write Mode: il dispositivo legge e/o scrive dati da/su un target passivo. È una modalità di utilizzo molto comune;
  • Card emulation mode: il dispositivo agisce emulando il comportamento di una card in modo da poter essere letto da ulteriori dispositivi.

NFC in Android

Il supporto per NFC su Android è stato introdotto con la versione 2.3 e si è andato ampliando sempre più fino all'arrivo di Android Beam
nella versione Ice Cream Sandwich, che ha definitivamente messo a disposizione degli sviluppatori la Peer Mode.

Tutte le classi necessarie sono state inserite nei package android.nfc e android.nfc.tech.

Affinchè possano essere utilizzate è necessario che vengano rispettati tre prerequisiti, tutti da specificare nel file AndroidManifest.xml:

  • la versione minima dell'SDK deve essere la 10, inserendo pertanto:
    <uses-sdk android:minSdkVersion=”10”/>
  • a livello hardware, deve essere disponibile il lettore NFC nel dispositivo, richiedendolo come apposita feature:
    <uses-feature android:name=”android.hardware.nfc” android:required=”true”/>
  • deve essere richiesta la permission necessaria con:
    <uses-permission android:name=”android.permission.NFC”/>

La classe di accesso al mondo NFC è NfcAdapter. Se ne ottiene un riferimento mediante l'invocazione:

NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);

Tale riferimento, per essere valido e dimostrare che la tecnologia NFC è nelle nostre disponibilità, dovrebbe:

  • non essere nullo;
  • restituire true all'invocazione del metodo adapter.isEnabled().

Una volta verificate queste condizioni, possiamo procedere con l'utilizzo di questa tecnologia.

Come tante altre attività nel sistema Android, la notifica di informazioni avviene mediante Intent. Questo tipo di messaggi sono alla base del meccanismo
primario per l'interazione con NFC: la scansione di ricerca dei tag.

Lo scopo di questi Intent è quello di essere intercettati direttamente da un'Activity e la loro tipologia specifica quale tecnologia è stata riconosciuta
nel tag individuato:

  • NfcAdapter.ACTION_NDEF_DISCOVERED: è stato individuato un tag che implementa lo standard NDEF;
  • NfcAdapter.ACTION_TECH_DISCOVERED: viene lanciato dal sistema se il tag implementa una tecnologia nota che esula dallo standard NDEF o anche se il tag è
    NDEF ma non c'è alcuna applicazione installata in grado di gestirla;
  • NfcAdapter.ACTION_TAG_DISCOVERED: significa che non c'è alcuna applicazione sul dispositivo che è in grado di gestire gli standard cui il tag si
    riferisce o che quest'ultimo non mostra di possedere alcuna tecnologia nota.

Affinchè la nostra applicazione possa essere destinataria di uno di questi Intent è necessario che siano specificati all'interno del Manifest uno o più
IntentFilter necessari:

<activity
android:name="....."
android:label=".....">
<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"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>

All'action MAIN negli intent-filter siamo abituati già dai primi esempi di questa guida. Serve a selezionare quale activity all'interno dell'applicazione
sia quella che deve essere invocata per prima. Con questo nuovo filtro, invece, la nostra app indica al sistema di voler candidarsi alla gestione di una
determinata tipologia di tag, in questo caso NDEF.

Allo scopo, può essere utile sapere che oltre all'action si può specificare quali tecnologie trattare. Lo si può fare utilizzando le risorse di tipo
<tech-list> e <tech> in un file di configurazione collocato nella cartella res/xml. Una volta definita questa risorsa la si può collegare ad un
intent-filter mediante un nodo <meta-data>.

Un altro aspetto che va spiegato è che la nostra Activity deve registrarsi al foreground dispatch system. Esso dovrà essere attivo in tutta la fase di
interazione tra utente e app quindi – come abbiamo imparato a proposito del ciclo di vita – tra l'invocazione dei metodi onResume e onPause. Lo scopo di
questo è evitare che se viene avvicinato il dispositivo al tag mentre l'app è già aperta, non si tenterà di aprirla nuovamente. Ciò viene attuato con il
metodo enableForegroundDispatch e disattivato con disableForegroundDispatch, entrambi della classe NfcAdapter.

I dati relativi al tag rilevato saranno reperiti all'interno dell'Intent che verrà inviato all'Activity. A seconda della tipologia di target e delle
tecnologie con le quali si è scelto di dialogare, si potranno usare delle classi apposite come NdefMessage e NdefRecord, di cui la documentazione ufficiale
spiega diffusamente i dettagli.

Ti consigliamo anche