Partajarea fișierelor cu NFC pe Android

În acest tutorial, veți învăța elementele de bază ale comunicării P2P (peer-to-peer) și creați o aplicație pentru a partaja fișiere mari, cum ar fi imagini și videoclipuri, de la un dispozitiv la altul, folosind NFC.

1. Introducere

NFC sau Near Field Communication este un set de tehnologii wireless cu rază scurtă de acțiune. Permite schimbul de date între o etichetă NFC și un dispozitiv compatibil NFC sau între dispozitivele compatibile NFC la o distanță de maximum 4 cm.

Există trei moduri de operare NFC:

  • Citirea și scrierea etichetelor contactless: Aceste etichete sunt, în general, foarte mici și nu necesită nicio baterie. Ele pot fi încorporate în tot felul de obiecte, cum ar fi postere de film, produse, autocolante și așa mai departe.
  • Modul de emulare a cartelei: Gândiți-vă la carduri de credit inteligente. Acest lucru permite unui dispozitiv Android să se comporte ca o cartelă inteligentă. Beneficiul evident al acestui lucru este că dispozitivul dvs. poate acționa ca un singur card și apoi să se comporte ca unul diferit la atingerea unui buton. Acesta este un mod în care un dispozitiv Android poate înlocui portofelul. Oricare ar fi cardul de credit, trecerea autobuzului sau biletul pe care îl utilizați, dispozitivul dvs. Android ar putea să se înfăptuiască - bineînțeles - elementul respectiv. Cititorul din cealaltă parte a tranzacției crede că interacționează cu elementul respectiv, când, de fapt, are de-a face cu un dispozitiv Android.
  • Comunicații peer-to-peer: Fiecare parte recunoaște că vorbește cu un alt dispozitiv și nu doar cu o etichetă. Protocolul a fost dezvoltat de Google și permite ca două dispozitive să trimită mesaje înainte și înapoi.

Funcția de schimb de date peer-to-peer (P2P) a fost adăugată la Android în nivelul API 14 (Android 4.0, Ice Cream Sandwich) și se numește Android Beam. Permite schimbul rapid de date pe distanțe scurte între două dispozitive Android activate pentru NFC.

2. Comunicarea P2P cu Android Beam

Caracteristica de schimb de date Android Beam are două API-uri Transferul NDEF API și transfer de fișier API-ul.

NDEF Transfer API

Acest API a fost introdus în nivelul 14 API (Android 4.0, Ice Cream Sandwich) și permite transferul unor cantități mici de date, cum ar fi adrese URL, contacte etc. Datele care trebuie transferate trebuie să fie formate în format NDEF (NFC Data Exchange Format) trimis ca mesaj NDEF.

API de transfer de fișiere

API-ul de transfer de fișiere a fost introdus în nivelul API 16 (Android 4.1, Jelly Bean) și permite transferul de fișiere mari, cum ar fi imagini, videoclipuri etc..

Există însă unele avertismente. Android Beam funcționează numai atunci când aplicația care trimite datele se află în prim-plan și dispozitivul care primește datele este deblocat.

Android Beam file transfer API are două cerințe suplimentare:

  • Fișierele care trebuie transferate trebuie să fie amplasate în spațiul de stocare extern.
  • Fișierele care trebuie transferate trebuie să fie citite de lume.

În acest tutorial, vom utiliza API-ul de transfer de fișiere Android Beam al SDK-ului Android pentru a crea o aplicație care permite utilizatorilor să partajeze fișiere între dispozitive.

3. Cerințe

Datorită limitărilor emulatorului, aplicația trebuie să fie testată cu două dispozitive fizice Android activate pentru Android, care rulează Android 4.1 sau o versiune ulterioară.

4. Noțiuni de bază

Folosind Eclipse, creați un nou proiect de aplicații Android și denumiți-l NFCDemo

Deoarece transferul de fișiere Android Beam este disponibil numai pe dispozitive care rulează Android 4.1+, trebuie să setăm SDK minim necesar la API 16: Android 4.1 (Jelly Bean).

5. Configurarea fișierului Manifest

Pentru a utiliza NFC într-o aplicație Android, trebuie să declare permisiunea NFC în fișierul manifest, după cum se arată mai jos.

În plus, pentru a citi fișierele din spațiul de stocare extern, declarați READ_EXTERNAL_STORAGE după cum se arată mai jos.

 

Nu toate dispozitivele Android suportă NFC. Pentru a vă asigura că aplicația noastră apare numai în Google Play pentru dispozitivele care acceptă NFC, adăugați-o  element în fișierul manifest.

Dacă NFC este o caracteristică opțională a aplicației, atunci omiteți element din fișierul manifest și setați versiunea SDK minimă la un nivel API inferior. În acest caz, trebuie să verificați dacă dispozitivul acceptă NFC și aplicația Android Beam API și actualizați interfața utilizator în consecință.

6. Crearea planurilor

Deschide activity_main.xml layout fișier și adăugați un Buton așa cum se arată mai jos. După cum puteți vedea, am adăugat o Buton pe care utilizatorul o poate atinge pentru a iniția transferul unui fișier.

 

7. Implementarea transferului de fișiere

Deschide Activitate principala clasați și înlocuiți implementarea actuală cu cea prezentată mai jos. Nu vă faceți griji cu privire la punerea în aplicare pentru moment. O să explic fiecare pas într-o clipă.

pachet com.tutsplus.nfcdemo; import java.io.File; importă android.app.Activity; import șiroid.content.Intent; import șiroid.content.pm.PackageManager; importul android.net.Uri; import șiroid.nfc.NfcAdapter; import șiroid.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.Settings; import șiroid.view.View; importă android.widget.Toast; clasa publica MainActivity extinde Activitatea private NfcAdapter nfcAdapter; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); PackageManager pm = acest.getPackageManager (); // Verificați dacă NFC este disponibil pe dispozitiv dacă (! Pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC nu este disponibil pe dispozitiv. Toast.makeText (aceasta, "Dispozitivul nu are hardware NFC", Toast.LENGTH_SHORT) .show ();  // Verificați dacă dispozitivul rulează Android 4.1 sau o versiune superioară dacă (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. Testarea aplicației

Înainte de a ne scufunda în cod, să vedem ce măsuri trebuie să luăm pentru a transfera un fișier de la un dispozitiv la altul.

Pasul 1

Conectați unul dintre cele două dispozitive Android la stația de lucru de dezvoltare prin USB cu depanare USB activat. Să ne referim la acel dispozitiv ca pe expeditor.

Pasul 2

Permite NFC și Android Beam pe expeditor. presa F11 pentru a depana aplicația. Acest lucru se va instala și lansa NFCDemo pe expeditor.

Pasul 3

Permite NFC pe cel de-al doilea dispozitiv, receptor.

Pasul 4

Apasă pe Trimite fișier butonul și poziționează dispozitivele aproape împreună pentru a permite NFC să își desfășoare activitatea. Ar trebui să vezi a Atingeți pentru a transmite mesajul apar pe expeditor. Atingeți ecranul pentru a iniția transferul.

Pasul 5

Receptorul ar trebui să afișeze o notificare în bara de stare pentru a indica progresul transferului de fișiere.

 

Pasul 6

Dacă transferul de fișiere este încheiat cu succes, a Beam complet mesajul este afișat utilizatorului.

9. Decodarea codului

Să aruncăm o privire la codul care face toate acestea posibil.

Determinați capacitățile dispozitivelor

După cum am menționat mai devreme, dacă NFC este o caracteristică opțională a aplicației noastre, ar trebui să verificăm suportul pentru NFC și Android Beam. Acest control poate fi efectuat oriunde în aplicația noastră. În acest exemplu, am pus codul în onCreate metodă a Activitate principala clasă.

Pasul 1

Obțineți o referință la PackageManager.

PackageManager pm = acest.getPackageManager ();

PackageManager clasa deține informații despre toate pachetele instalate pe dispozitiv.

Pasul 2

Suna hasSystemFeature metoda pe PackageManager obiect pentru a determina dacă dispozitivul are suport NFC. Această metodă revine Adevăratdacă funcția dorită este acceptată de dispozitiv.

dacă (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC nu este disponibil pe dispozitiv.  altceva // NFC este disponibil pe dispozitiv. 

Pasul 3

Dacă dispozitivul are suport NFC, trebuie să verificăm versiunea Android a dispozitivului. Versiunea Android (nivelul API) care rulează pe un dispozitiv este disponibilă prin  android.os.Build.VERSION.SDK_INT. Dacă versiunea este mai mare sau egală cu 16, Build.VERSION_CODES.JELLY_BEAN, apoi dispozitivul acceptă transferul de fișiere Android Beam.

dacă (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC nu este disponibil pe dispozitiv.  // Verificați dacă dispozitivul rulează Android 4.1 sau o versiune superioară dacă (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)  // Android Beam feature is not supported.  else  // NFC and Android Beam file transfer is supported. 

Inițiați transferul de fișiere

După ce am stabilit că dispozitivul are capabilitățile necesare, putem iniția transferul de fișiere utilizând Android Beam.

Pasul 1

Obțineți o referință la NfcAdapter.

nfcAdapter = NfcAdapter.getDefaultAdapter (acest lucru); 

Locul de muncă al NfcAdapter este de a gestiona schimbul de date între o etichetă NFC și un dispozitiv compatibil NFC sau între două dispozitive cu funcție NFC.

Pasul 2

Adaptorul poate fi activat sau dezactivat. Pentru a determina dacă adaptorul este activat, apelați este activat metoda pe NfcAdapter obiect.

// Verificați dacă NFC este activat pe dispozitiv dacă (! NfcAdapter.isEnabled ()) // NFC este dezactivat, afișați interfața de setări pentru a activa NFC altceva // NFC este activată

Această metodă revine Adevăratdacă NFC este activat pe dispozitiv. Dacă NFC este dezactivată, îi solicităm utilizatorului să o activeze și să afișeze interfața utilizator pentru setările NFC. 

startActivitate (nou intenție (Setări.ACTION_NFC_SETTINGS));

Pasul 3

În mod similar, funcția Android Beam poate fi activată sau dezactivată. Pentru a verifica starea sa, apelați isNdefPushEnabled metoda pe NfcAdapter obiect.

// Verificați dacă NFC este activat pe dispozitiv dacă (! NfcAdapter.isEnabled ()) // NFC este dezactivat, afișați setările UI pentru a activa NFC // Verificați dacă funcția Android Beam este activată pe alt dispozitiv dacă (! NfcAdapter. isNdefPushEnabled ()) // Android Beam este dezactivat, afișați interfața de setări pentru a activa Android Beam altceva // NFC și Android Beam ambele sunt activate

Dacă se întoarce această metodă fals, solicităm utilizatorului să îl activeze și să afișeze interfața cu utilizatorul pentru setările Android Beam.

startActivity (nou intenție (Setări.ACTION_NFCSHARING_SETTINGS));

Dacă sunt activate atât NFC cât și Android Beam, putem continua transferul de fișiere.

Pasul 4

Creaza un nou Fişier utilizând directorul în care este localizat fișierul pe dispozitiv și numele fișierului. Pentru a testa transferul de fișiere, am adăugat o imagine numită wallpaper.png în Fotografii director în memoria externă.

// Creați un fișier nou utilizând directorul și numele specificat Fișier fileToTransfer = Fișier nou (fileDirectory, fileName);

Pasul 5

Suna setBeamPushUris metoda pe NfcAdapter obiect și să treacă URI-ul fișierului care urmează să fie transferat.

nfcAdapter.setBeamPushUris (noul Uri [] Uri.fromFile (fileToTransfer), acest lucru);

 setBeamPushUris metoda acceptă o serie de uri obiecte. Dacă doriți să trimiteți mai mult de un fișier, aveți posibilitatea să transmiteți mai multe URI-uri către adaptor.

URI-urile au fost transmise către setBeamPushUris metoda sunt puse în așteptare de către adaptor și sunt transferate către dispozitivul de primire imediat ce se află în imediata vecinătate a dispozitivului de trimitere.

Concluzie

În acest tutorial, ați învățat despre noțiunile de bază despre NFC pe Android. De asemenea, ați învățat cum să restricționați accesul la o aplicație de către dispozitivele neacceptate utilizând fișierul manifest și să determinați capacitățile dispozitivului în timpul rulării. Pentru a trimite fișiere utilizând NFC, am făcut uz de NfcAdapter clasă.

În timp ce am încercat să acopere principiile de lucru cu API-ul de transfer de fișiere Android Beam pentru a vă ajuta să începeți, mai sunt încă explorate. Dacă doriți să aflați mai multe, vă recomand să vizitați portalul pentru dezvoltatori Android pentru mai multe informații.

Cod