Î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.
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:
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.
Caracteristica de schimb de date Android Beam are două API-uri Transferul NDEF API și transfer de fișier API-ul.
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-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:
Î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.
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ă.
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).
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ță.
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.
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);
Î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.
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.
Permite NFC și Android Beam pe expeditor. presa F11 pentru a depana aplicația. Acest lucru se va instala și lansa NFCDemo pe expeditor.
Permite NFC pe cel de-al doilea dispozitiv, receptor.
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.
Receptorul ar trebui să afișeze o notificare în bara de stare pentru a indica progresul transferului de fișiere.
Dacă transferul de fișiere este încheiat cu succes, a Beam complet mesajul este afișat utilizatorului.
Să aruncăm o privire la codul care face toate acestea posibil.
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ă.
Obțineți o referință la PackageManager
.
PackageManager pm = acest.getPackageManager ();
PackageManager
clasa deține informații despre toate pachetele instalate pe dispozitiv.
Suna hasSystemFeature
metoda pe PackageManager
obiect pentru a determina dacă dispozitivul are suport NFC. Această metodă revine Adevărat
dacă 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.
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.
După ce am stabilit că dispozitivul are capabilitățile necesare, putem iniția transferul de fișiere utilizând Android Beam.
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.
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ărat
dacă 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));
Î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.
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);
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.
Î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.