Condivisione di file con NFC su Android

In questo tutorial imparerai le basi della comunicazione P2P (peer-to-peer) e creerai un'applicazione per condividere file di grandi dimensioni, come immagini e video, da un dispositivo a un altro utilizzando NFC (near field communication) su Android.

1. Introduzione

NFC o Near Field Communication è un insieme di tecnologie wireless a corto raggio. Consente lo scambio di dati tra un tag NFC e un dispositivo abilitato NFC o tra dispositivi abilitati NFC entro una distanza non superiore a 4 cm.

Esistono tre modalità di funzionamento NFC:

  • Leggere e scrivere tag senza contatto: Questi tag sono generalmente molto piccoli e non richiedono alcuna alimentazione a batteria. Possono essere incorporati in tutti i tipi di oggetti, come manifesti di film, prodotti, adesivi e così via.
  • Modalità di emulazione della scheda: Pensa a carte di credito intelligenti. Ciò consente a un dispositivo Android di agire come una smart card. L'ovvio vantaggio di questo è che il tuo dispositivo può agire come una carta e quindi agire come un altro con il semplice tocco di un pulsante. Questo è un modo in cui un dispositivo Android può sostituire il tuo portafoglio. Qualunque sia la carta di credito, il lasciapassare o il biglietto che stai utilizzando, il tuo dispositivo Android potrebbe impersonare, in modo sicuro, quell'elemento. Il lettore dall'altra parte della transazione pensa che stia interagendo con quell'elemento, mentre in realtà si tratta di un dispositivo Android.
  • Comunicazione peer-to-peer: Ogni lato riconosce che sta parlando con un altro dispositivo e non solo con un tag. Il protocollo è stato sviluppato da Google e consente a due dispositivi di inviare messaggi avanti e indietro.

La funzionalità di scambio dati peer-to-peer (P2P) è stata aggiunta ad Android nel livello API 14 (Android 4.0, Ice Cream Sandwich) e viene chiamata Android Beam. Consente il rapido scambio a corto raggio di dati tra due dispositivi Android abilitati NFC.

2. Comunicazione P2P con Android Beam

La funzione di scambio dati di Android Beam ha due API, la Trasferimento NDEF API e il trasferimento di file API.

API di trasferimento NDEF

Questa API è stata introdotta nel livello API 14 (Android 4.0, Ice Cream Sandwich) e consente il trasferimento di piccole quantità di dati come URL, contatti, ecc. I dati da trasferire devono essere formattati in NDEF (NFC Data Exchange Format) ed è inviato come messaggio NDEF.

API di trasferimento file

L'API di trasferimento file è stata introdotta nel livello API 16 (Android 4.1, Jelly Bean) e consente il trasferimento di file di grandi dimensioni, come immagini, video, ecc..

Ci sono alcuni avvertimenti però. Android Beam funziona solo quando l'applicazione che invia i dati è in esecuzione in primo piano e il dispositivo che riceve i dati è sbloccato.

L'API di trasferimento file Android Beam ha due requisiti aggiuntivi:

  • I file che devono essere trasferiti devono trovarsi nella memoria esterna.
  • I file che devono essere trasferiti devono essere leggibili a livello mondiale.

In questo tutorial, utilizzeremo l'API di trasferimento file Android Beam di Android SDK per creare un'applicazione che consente agli utenti di condividere file tra dispositivi.

3. Requisiti

A causa delle limitazioni dell'emulatore, l'applicazione deve essere testata con due dispositivi Android abilitati per NFC con Android 4.1 o versione successiva.

4. Iniziare

Usando Eclipse, crea un nuovo progetto di applicazione Android e nominalo NFCDemo

Poiché il trasferimento file Android Beam è disponibile solo su dispositivi con Android 4.1 o versioni successive, è necessario impostarlo SDK richiesto minimo a API 16: Android 4.1 (Jelly Bean).

5. Configurazione del file manifest

Per utilizzare NFC in un'app Android, dobbiamo dichiarare l'autorizzazione NFC nel file manifest come mostrato di seguito.

Inoltre, per leggere i file da una memoria esterna, dichiarare il file READ_EXTERNAL_STORAGE permesso come mostrato di seguito.

 

Non tutti i dispositivi Android supportano NFC. Per assicurarti che la nostra app venga visualizzata solo su Google Play per i dispositivi che supportano NFC, aggiungi il  elemento al file manifest.

Se NFC è una funzione opzionale della tua app, puoi omettere il elemento dal file manifest e impostare la versione minima dell'SDK su un livello API inferiore. In tal caso, è necessario verificare se il dispositivo supporta NFC e l'API Android Beam e aggiornare di conseguenza l'interfaccia utente.

6. Creazione di layout

Apri il activity_main.xml file di layout e aggiungi a Pulsante come mostrato di seguito. Come puoi vedere, abbiamo aggiunto un Pulsante che l'utente può toccare per avviare il trasferimento di un file.

 

7. Implementazione del trasferimento di file

Apri il Attività principale classe e sostituire l'attuale implementazione con quella mostrata sotto. Non preoccuparti per l'implementazione per ora. Spiegherò ogni passo in un momento.

pacchetto com.tutsplus.nfcdemo; import java.io.File; importare android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.nfc.NfcAdapter; importa android.os.Build; importare android.os.Bundle; import android.os.Environment; importare android.provider.Settings; importa android.view.View; importare android.widget.Toast; public class MainActivity estende Activity private NfcAdapter nfcAdapter; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); PackageManager pm = this.getPackageManager (); // Controlla se NFC è disponibile sul dispositivo se (! Pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC non è disponibile sul dispositivo. Toast.makeText (questo, "Il dispositivo non ha hardware NFC.", Toast.LENGTH_SHORT) .show ();  // Controlla se il dispositivo esegue Android 4.1 o versioni successive se (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)  // Android Beam feature is not supported. Toast.makeText(this, "Android Beam is not supported.", Toast.LENGTH_SHORT).show();  else  // NFC and Android Beam file transfer is supported. Toast.makeText(this, "Android Beam is supported on your device.", Toast.LENGTH_SHORT).show();   public void sendFile(View view)  nfcAdapter = NfcAdapter.getDefaultAdapter(this); // Check whether NFC is enabled on device if(!nfcAdapter.isEnabled()) // NFC is disabled, show the settings UI // to enable NFC Toast.makeText(this, "Please enable NFC.", Toast.LENGTH_SHORT).show(); startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));  // Check whether Android Beam feature is enabled on device else if(!nfcAdapter.isNdefPushEnabled())  // Android Beam is disabled, show the settings UI // to enable Android Beam Toast.makeText(this, "Please enable Android Beam.", Toast.LENGTH_SHORT).show(); startActivity(new Intent(Settings.ACTION_NFCSHARING_SETTINGS));  else  // NFC and Android Beam both are enabled // File to be transferred // For the sake of this tutorial I've placed an image // named 'wallpaper.png' in the 'Pictures' directory String fileName = "wallpaper.png"; // Retrieve the path to the user's public pictures directory File fileDirectory = Environment .getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); // Create a new file using the specified directory and name File fileToTransfer = new File(fileDirectory, fileName); fileToTransfer.setReadable(true, false); nfcAdapter.setBeamPushUris( new Uri[]Uri.fromFile(fileToTransfer), this);    

8. Testare l'app

Prima di immergerci nel codice, vediamo quali sono i passaggi da eseguire per trasferire un file da un dispositivo a un altro.

Passo 1

Collega uno dei due dispositivi Android alla workstation di sviluppo tramite USB con Debug USB abilitato. Facciamo riferimento a quel dispositivo come il mittente.

Passo 2

Abilitare NFC e Android Beam sul mittente. stampa F11 per eseguire il debug dell'applicazione. Questo verrà installato e avviato NFCDemo sul mittente.

Passaggio 3

Abilitare NFC sul secondo dispositivo, il ricevitore.

Passaggio 4

Clicca il Inviare file pulsante e posizionare i dispositivi vicini per consentire a NFC di funzionare. Dovresti vedere a Tocca per trasmettere messaggio appare sul mittente. Tocca lo schermo per avviare il trasferimento.

Passaggio 5

Il ricevitore dovrebbe mostrare una notifica nella barra di stato per indicare l'avanzamento del trasferimento del file.

 

Passaggio 6

Se il trasferimento del file è stato completato correttamente, a Fascio completo messaggio viene visualizzato per l'utente.

9. Decodifica del codice

Diamo un'occhiata al codice che rende tutto questo possibile.

Determina le funzionalità del dispositivo

Come accennato in precedenza, se NFC è una funzionalità opzionale della nostra app dovremmo controllare il supporto NFC e Android Beam. Questo controllo può essere eseguito ovunque nella nostra app. In questo esempio, ho inserito il codice nel file onCreate metodo del Attività principale classe.

Passo 1

Ottenere un riferimento al PackageManager.

PackageManager pm = this.getPackageManager ();

Il PackageManager class contiene informazioni su tutti i pacchetti installati sul dispositivo.

Passo 2

Chiama il hasSystemFeature metodo sul PackageManager oggetto per determinare se il dispositivo ha il supporto NFC. Questo metodo restituisce verose la funzione desiderata è supportata dal dispositivo.

if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC non è disponibile sul dispositivo.  else // NFC è disponibile sul dispositivo. 

Passaggio 3

Se il dispositivo ha il supporto NFC, allora dobbiamo controllare la versione Android del dispositivo. La versione Android (livello API) in esecuzione su un dispositivo è disponibile tramite  android.os.Build.VERSION.SDK_INT. Se la versione è maggiore o uguale a 16, Build.VERSION_CODES.JELLY_BEAN, quindi il dispositivo supporta il trasferimento di file Android Beam.

if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC non è disponibile sul dispositivo.  // Controlla se il dispositivo esegue Android 4.1 o versioni successive se (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)  // Android Beam feature is not supported.  else  // NFC and Android Beam file transfer is supported. 

Avvia trasferimento file

Una volta stabilito che il dispositivo ha le capacità richieste, possiamo avviare il trasferimento dei file utilizzando Android Beam.

Passo 1

Ottenere un riferimento al NfcAdapter.

nfcAdapter = NfcAdapter.getDefaultAdapter (this); 

Il lavoro del NfcAdapter è gestire lo scambio di dati tra un tag NFC e un dispositivo abilitato NFC o tra due dispositivi abilitati NFC.

Passo 2

L'adattatore può essere abilitato o disabilitato. Per determinare se l'adattatore è abilitato, chiamare il è abilitato metodo sul NfcAdapter oggetto.

// Verifica se NFC è abilitato sul dispositivo se (! NfcAdapter.isEnabled ()) // NFC è disabilitato, mostra l'interfaccia utente delle impostazioni per abilitare NFC else // NFC è abilitato

Questo metodo restituisce verose NFC è abilitato sul dispositivo. Se NFC è disabilitato, chiediamo all'utente di abilitarlo e mostrare l'interfaccia utente delle impostazioni NFC. 

startActivity (new Intent (Settings.ACTION_NFC_SETTINGS));

Passaggio 3

Allo stesso modo, la funzione Android Beam può anche essere abilitata o disabilitata. Per verificare il suo stato, chiama il isNdefPushEnabled metodo sul NfcAdapter oggetto.

// Controlla se NFC è abilitato sul dispositivo se (! NfcAdapter.isEnabled ()) // NFC è disabilitato, mostra l'interfaccia utente delle impostazioni per abilitare NFC // Controlla se la funzione Android Beam è abilitata sul dispositivo else se (! NfcAdapter. isNdefPushEnabled ()) // Android Beam è disabilitato, mostra l'interfaccia utente delle impostazioni per abilitare Android Beam else // NFC e Android Beam sono entrambi abilitati

Se questo metodo ritorna falso, chiediamo all'utente di abilitarlo e mostrare l'interfaccia utente delle impostazioni di Android Beam.

startActivity (new Intent (Settings.ACTION_NFCSHARING_SETTINGS));

Se sono abilitati sia NFC che Android Beam, possiamo procedere con il trasferimento dei file.

Passaggio 4

Crea un nuovo File utilizzando la directory in cui si trova il file sul dispositivo e il nome del file. Per testare il trasferimento del file, ho aggiunto un'immagine chiamata l'immagine di sfondo nel Immagini directory nella memoria esterna.

// Crea un nuovo file usando la directory e il nome specificati File fileToTransfer = new File (fileDirectory, fileName);

Passaggio 5

Chiama il setBeamPushUris metodo sul NfcAdapter oggetto e passa l'URI del file da trasferire.

nfcAdapter.setBeamPushUris (new Uri [] Uri.fromFile (fileToTransfer), this);

Il setBeamPushUris metodo accetta un array di Uri oggetti. Se si desidera inviare più di un file, è possibile passare più URI alla scheda.

Gli URI sono passati al setBeamPushUris i metodi vengono accodati dall'adattatore e vengono trasferiti sul dispositivo ricevente non appena si trovano in prossimità del dispositivo di invio.

Conclusione

In questo tutorial, hai imparato le nozioni di base di NFC su Android. Hai anche imparato a limitare l'accesso a un'app da dispositivi non supportati utilizzando il file manifest e determinare le funzionalità del dispositivo in fase di runtime. Per inviare file usando NFC, abbiamo fatto uso di NfcAdapter classe.

Mentre ho cercato di illustrare le basi del lavoro con l'API di trasferimento file Android Beam per aiutarti a iniziare, c'è ancora più esplorazione. Se desideri saperne di più, ti invito a visitare il portale per sviluppatori Android per ulteriori informazioni.