I denne opplæringen lærer du grunnleggende om P2P (peer-to-peer) -kommunikasjon og lager et program for å dele store filer, for eksempel bilder og videoer, fra en enhet til en annen, ved hjelp av NFC (nær feltkommunikasjon) på Android.
NFC eller Nær feltkommunikasjon er et sett med trådløse kortteknologier. Den gjør det mulig å utveksle data mellom en NFC-tag og en NFC-aktivert enhet, eller mellom NFC-aktiverte enheter innen en avstand på ikke mer enn 4 cm.
Det finnes tre modus for NFC-operasjon:
Peer-to-peer (P2P) datautvekslingsfunksjon ble lagt til Android i API-nivå 14 (Android 4.0, Ice Cream Sandwich) og kalles Android Beam. Det muliggjør rask, kort rekkeviddeutveksling av data mellom to NFC-aktiverte Android-enheter.
Android Beam Data Exchange-funksjonen har to APIer, NDEF overføring API og filoverføring API.
Denne API-en ble introdusert i API-nivå 14 (Android 4.0, Ice Cream Sandwich) og muliggjør overføring av små mengder data som nettadresser, kontakter etc. Dataene som skal overføres må formateres i NDEF (NFC Data Exchange Format) og er sendt som en NDEF-melding.
Filoverførings-API ble introdusert i API-nivå 16 (Android 4.1, Jelly Bean) og muliggjør overføring av store filer, for eksempel bilder, videoer osv..
Det er imidlertid noen advarsler. Android Beam fungerer bare når applikasjonen som sender dataene kjører i forgrunnen, og enheten som mottar data, er låst opp.
Android Beam filoverføring API har to ytterligere krav:
I denne veiledningen vil vi bruke Android Beam-filoverførings-API for Android SDK for å lage et program som lar brukerne dele filer mellom enheter.
På grunn av begrensningene til emulatoren, må programmet testes med to fysiske NFC-aktiverte Android-enheter som kjører Android 4.1 eller høyere.
Ved hjelp av Eclipse, opprett et nytt Android-applikasjonsprosjekt og merk det NFCDemo.
Siden Android Beam-filoverføring bare er tilgjengelig på enheter som kjører Android 4.1+, må vi sette inn Minimumskrav SDK til API 16: Android 4.1 (Jelly Bean).
For å kunne bruke NFC i en Android-app, må vi deklarere NFC-tillatelsen i manifestfilen som vist nedenfor.
I tillegg, for å lese filer fra ekstern lagring, erklære READ_EXTERNAL_STORAGE
tillatelse som vist nedenfor.
Ikke alle Android-enheter støtter NFC. For å sikre at vår app bare vises i Google Play for de enhetene som støtter NFC, legger du til
element til manifestfilen.
Hvis NFC er en valgfri funksjon i appen din, kan du utelate
element fra manifestfilen og sett den minste SDK-versjonen til et lavere API-nivå. I så fall må du sjekke om enheten støtter NFC og Android Beam API, og oppdater brukergrensesnittet tilsvarende.
Åpne activity_main.xml
layoutfil og legg til en Knapp
som vist under. Som du kan se, har vi lagt til en Knapp
som brukeren kan trykke for å starte overføringen av en fil.
Åpne Hoved aktivitet
klasse og erstatt gjeldende implementering med den som vises nedenfor. Ikke bekymre deg for implementeringen for nå. Jeg skal forklare hvert trinn i et øyeblikk.
pakke com.tutsplus.nfcdemo; importer java.io.File; importer android.app.Activity; importer android.content.Intent; importer android.content.pm.PackageManager; importer android.net.Uri; importer android.nfc.nfcAdapter; importere android.os.Build; importere android.os.Bundle; importere android.os.Environment; importere android.provider.Settings; importer android.view.View; importer android.widget.Toast; offentlig klasse MainActivity utvider Aktivitet privat NfcAdapter nfcAdapter; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); PackageManager pm = this.getPackageManager (); // Sjekk om NFC er tilgjengelig på enheten hvis (! Pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC ikke er tilgjengelig på enheten. Toast.makeText (dette, "Enheten har ikke NFC-maskinvare.", Toast.LENGTH_SHORT) .show (); // Sjekk om enheten kjører Android 4.1 eller høyere annet hvis (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);
Før vi dykker inn i koden, la oss se hvilke trinn vi må ta for å overføre en fil fra en enhet til en annen.
Koble en av de to Android-enhetene til utviklings arbeidsstasjonen via USB med USB feilsøking aktivert. La oss referere til den enheten som avsender.
Aktiver NFC og Android Beam på avsenderen. trykk F11 å feilsøke applikasjonen. Dette vil installere og starte NFCDemo på avsenderen.
Aktiver NFC på den andre enheten, mottaker.
Trykk på Send fil knappen og plasser enhetene tett sammen for å la NFC gjøre sitt arbeid. Du bør se en Berør for å stråle melding vises på avsenderen. Trykk på skjermen for å starte overføringen.
Mottakeren skal vise et varsel i statuslinjen for å indikere fremdriften i filoverføringen.
Hvis filoverføringen er fullført, a Beam fullført meldingen vises til brukeren.
La oss ta en titt på koden som gjør alt dette mulig.
Som nevnt tidligere, hvis NFC er et valgfritt element i appen vår, bør vi sjekke om støtte for NFC og Android Beam. Denne sjekken kan utføres hvor som helst i vår app. I dette eksemplet har jeg satt koden i onCreate
metode av Hoved aktivitet
klasse.
Hent en referanse til Package
.
PackageManager pm = this.getPackageManager ();
De Package
Klassen inneholder informasjon om alle pakkene som er installert på enheten.
Ring hasSystemFeature
metode på Package
Motta for å avgjøre om enheten har NFC-støtte. Denne metoden returnerer ekte
hvis ønsket funksjon støttes av enheten.
hvis (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC er ikke tilgjengelig på enheten. ellers // NFC er tilgjengelig på enheten.
Hvis enheten har NFC-støtte, må vi sjekke enhetens Android-versjon. Android-versjonen (API-nivå) som kjører på en enhet, er tilgjengelig via android.os.Build.VERSION.SDK_INT
. Hvis versjonen er større enn eller lik 16, Build.VERSION_CODES.JELLY_BEAN
, så støtter enheten Android Beam-filoverføring.
hvis (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC er ikke tilgjengelig på enheten. // Sjekk om enheten kjører Android 4.1 eller høyere annet hvis (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) // Android Beam feature is not supported. else // NFC and Android Beam file transfer is supported.
Når vi har fastslått at enheten har de nødvendige evner, kan vi starte filoverføringen ved hjelp av Android Beam.
Hent en referanse til NfcAdapter
.
nfcAdapter = NfcAdapter.getDefaultAdapter (dette);
Jobben til NfcAdapter
er å administrere utveksling av data mellom en NFC-tag og en NFC-aktivert enhet eller mellom to NFC-aktiverte enheter.
Adapteren kan aktiveres eller deaktiveres. For å finne ut om adapteren er aktivert, ring til Er på
metode på NfcAdapter
gjenstand.
// Sjekk om NFC er aktivert på enheten hvis (! NfcAdapter.isEnabled ()) // NFC er deaktivert, vis innstillingsgrensesnittet for å aktivere NFC else // NFC er aktivert
Denne metoden returnerer ekte
hvis NFC er aktivert på enheten. Hvis NFC er deaktivert, ber vi brukeren om å aktivere den og vise brukergrensesnittet for NFC-innstillinger.
startActivity (new Intent (Settings.ACTION_NFC_SETTINGS));
På samme måte kan Android Beam-funksjonen også aktiveres eller deaktiveres. For å sjekke tilstanden, ring isNdefPushEnabled
metode på NfcAdapter
gjenstand.
// Sjekk om NFC er aktivert på enheten hvis (! NfcAdapter.isEnabled ()) // NFC er deaktivert, vis innstillingsgrensesnittet for å aktivere NFC // Sjekk om Android Beam-funksjonen er aktivert på enheten ellers hvis (! NfcAdapter. isNdefPushEnabled ()) // Android Beam er deaktivert, vis innstillingsgrensesnittet for å aktivere Android Beam ellers // NFC og Android Beam begge er aktivert
Hvis denne metoden returnerer falsk
, Vi ber brukeren om å aktivere den og vise brukergrensesnittet for Android Beam-innstillinger.
startActivity (new Intent (Settings.ACTION_NFCSHARING_SETTINGS));
Hvis både NFC og Android Beam er aktivert, kan vi fortsette med filoverføringen.
Lage en ny Fil
bruker katalogen hvor filen ligger på enheten og navnet på filen. For å teste filoverføringen, har jeg lagt til et bilde som heter wallpaper.png i Bilder katalog i ekstern lagring.
// Opprett en ny fil ved hjelp av den angitte katalogen og navnet File fileToTransfer = ny fil (filkatalog, filnavn);
Ring setBeamPushUris
metode på NfcAdapter
objekt og passere URI av filen som skal overføres.
nfcAdapter.setBeamPushUris (ny Uri [] Uri.fromFile (fileToTransfer), dette);
De setBeamPushUris
Metoden aksepterer en rekke av Uri
objekter. Hvis du vil sende mer enn en fil, kan du sende flere URIer til adapteren.
URIene passerte til setBeamPushUris
Metoden er køen av adapteren og overføres til mottaksenheten så snart den kommer i nærheten av sendeenheten.
I denne opplæringen lærte du om grunnleggende om NFC på Android. Du har også lært hvordan du begrenser tilgangen til en app ved hjelp av ikke-støttede enheter ved hjelp av manifestfilen og bestemmer enhetskapasiteten ved kjøring. For å sende filer ved hjelp av NFC, brukte vi bruk av NfcAdapter
klasse.
Selv om jeg har forsøkt å dekke grunnleggende om å jobbe med Android Beam-filoverførings-API for å hjelpe deg med å komme i gang, er det fortsatt mer å utforske. Hvis du liker å lære mer, oppfordrer jeg deg til å besøke Android-utviklerportalen for mer informasjon.