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.
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:
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.
La funzione di scambio dati di Android Beam ha due API, la Trasferimento NDEF API e il trasferimento di file API.
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.
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:
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.
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.
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).
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.
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.
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);
Prima di immergerci nel codice, vediamo quali sono i passaggi da eseguire per trasferire un file da un dispositivo a un altro.
Collega uno dei due dispositivi Android alla workstation di sviluppo tramite USB con Debug USB abilitato. Facciamo riferimento a quel dispositivo come il mittente.
Abilitare NFC e Android Beam sul mittente. stampa F11 per eseguire il debug dell'applicazione. Questo verrà installato e avviato NFCDemo sul mittente.
Abilitare NFC sul secondo dispositivo, il ricevitore.
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.
Il ricevitore dovrebbe mostrare una notifica nella barra di stato per indicare l'avanzamento del trasferimento del file.
Se il trasferimento del file è stato completato correttamente, a Fascio completo messaggio viene visualizzato per l'utente.
Diamo un'occhiata al codice che rende tutto questo possibile.
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.
Ottenere un riferimento al PackageManager
.
PackageManager pm = this.getPackageManager ();
Il PackageManager
class contiene informazioni su tutti i pacchetti installati sul dispositivo.
Chiama il hasSystemFeature
metodo sul PackageManager
oggetto per determinare se il dispositivo ha il supporto NFC. Questo metodo restituisce vero
se la funzione desiderata è supportata dal dispositivo.
if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC non è disponibile sul dispositivo. else // NFC è disponibile sul dispositivo.
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.
Una volta stabilito che il dispositivo ha le capacità richieste, possiamo avviare il trasferimento dei file utilizzando Android Beam.
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.
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 vero
se 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));
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.
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);
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.
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.