Dele filer med NFC på Android

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.

1. Introduksjon

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:

  • Lese og skrive kontaktløse koder: Disse kodene er generelt svært små og krever ingen batteristrøm. De kan legges inn i alle slags objekter, for eksempel filmplakater, produkter, klistremerker og så videre.
  • Kortemuleringsmodus: Tenk smart kredittkort. Dette gjør at en Android-enhet kan fungere som et smartkort. Den åpenbare fordelen med dette er at enheten din kan fungere som ett kort og deretter opptre som en annen ved å trykke på en knapp. Dette er en måte en Android-enhet kan erstatte lommeboken til. Uansett kredittkort, busspass eller billett du bruker, kan Android-enheten din etterligne-sikkert, selvfølgelig-det elementet. Leseren på den andre siden av transaksjonen mener at den samhandler med det aktuelle elementet, når det faktisk handler om en Android-enhet.
  • Peer-to-peer-kommunikasjon: Hver side gjenkjenner at det snakker til en annen enhet og ikke bare en tagg. Protokollen er utviklet av Google og tillater to enheter å sende meldinger frem og tilbake.

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.

2. P2P-kommunikasjon med Android Beam

Android Beam Data Exchange-funksjonen har to APIer, NDEF overføring API og filoverføring API.

NDEF Transfer 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

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:

  • Filene som må overføres må være plassert i ekstern lagring.
  • Filene som må overføres må være verdenslesbare.

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.

3. Krav

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.

4. Komme i gang

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).

5. Konfigurere manifestfil

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.

6. Opprette layouter

Å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.

 

7. Implementere filoverføring

Å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);    

8. Teste appen

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.

Trinn 1

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.

Steg 2

Aktiver NFC og Android Beam på avsenderen. trykk F11 å feilsøke applikasjonen. Dette vil installere og starte NFCDemo på avsenderen.

Trinn 3

Aktiver NFC på den andre enheten, mottaker.

Trinn 4

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.

Trinn 5

Mottakeren skal vise et varsel i statuslinjen for å indikere fremdriften i filoverføringen.

 

Trinn 6

Hvis filoverføringen er fullført, a Beam fullført meldingen vises til brukeren.

9. Dekoding av koden

La oss ta en titt på koden som gjør alt dette mulig.

Bestem Enhetsfunksjoner

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.

Trinn 1

Hent en referanse til Package.

PackageManager pm = this.getPackageManager ();

De Package Klassen inneholder informasjon om alle pakkene som er installert på enheten.

Steg 2

Ring hasSystemFeature metode på Package Motta for å avgjøre om enheten har NFC-støtte. Denne metoden returnerer ektehvis ønsket funksjon støttes av enheten.

hvis (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC er ikke tilgjengelig på enheten.  ellers // NFC er tilgjengelig på enheten. 

Trinn 3

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. 

Start filoverføring

Når vi har fastslått at enheten har de nødvendige evner, kan vi starte filoverføringen ved hjelp av Android Beam.

Trinn 1

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.

Steg 2

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 ektehvis 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));

Trinn 3

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.

Trinn 4

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);

Trinn 5

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.

Konklusjon

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.