Dela filer med NFC på Android

I den här handledningen lär du dig grunderna i P2P-kommunikation (peer-to-peer) och skapar en applikation för att dela stora filer, till exempel bilder och videoklipp, från en enhet till en annan med hjälp av NFC (närliggande fältkommunikation) på Android.

1. Introduktion

NFC eller Nära fältkommunikation är en uppsättning trådlös trådlös teknik. Det möjliggör utbyte av data mellan en NFC-tagg och en NFC-aktiverad enhet eller mellan NFC-aktiverade enheter inom ett avstånd av högst 4 cm.

Det finns tre sätt att hantera NFC:

  • Läsa och skriva kontaktlösa taggar: Dessa taggar är i allmänhet mycket små och kräver ingen batteriström. De kan vara inbäddade i alla sorters objekt, till exempel filmaffischer, produkter, klistermärken osv.
  • Kortemuleringsläge: Tänk smart kreditkort. Detta gör att en Android-enhet kan fungera som ett smartkort. Den uppenbara fördelen med detta är att din enhet kan fungera som ett kort och sedan agera som en annan med en knapptryckning. På så vis kan en Android-enhet ersätta din plånbok. Oavsett kreditkort, busspass eller biljett du använder kan din Android-enhet efterlikna-säkert, givetvis det objektet. Läsaren på andra sidan transaktionen anser att det interagerar med det där objektet, när det faktiskt handlar om en Android-enhet.
  • Peer-to-peer-kommunikation: Varje sida känner igen att det pratar med en annan enhet och inte bara en tagg. Protokollet har utvecklats av Google och låter två enheter skicka meddelanden fram och tillbaka.

Peer-to-peer (P2P) datautbytesfunktionen lagts till Android i API-nivå 14 (Android 4.0, Ice Cream Sandwich) och kallas Android Beam. Det möjliggör snabb kortdistansutbyte av data mellan två NFC-aktiverade Android-enheter.

2. P2P-kommunikation med Android Beam

Android Beam Data Exchange-funktionen har två API: er, NDEF-överföring API och Filöverföring API.

NDEF Transfer API

Detta API introducerades i API-nivå 14 (Android 4.0, Ice Cream Sandwich) och möjliggör överföring av små mängder data som webbadresser, kontakter etc. De data som ska överföras måste formateras i NDEF (NFC Data Exchange Format) och är skickas som ett NDEF-meddelande.

File Transfer API

Filöverförings API infördes i API-nivå 16 (Android 4.1, Jelly Bean) och möjliggör överföring av stora filer, till exempel bilder, videoklipp etc..

Det finns dock vissa försiktighetsåtgärder. Android-strålning fungerar bara när applikationen som skickar data körs i förgrunden och enheten som tar emot data är upplåst.

Filöverförings API för Android Beam har två ytterligare krav:

  • Filerna som måste överföras måste placeras i extern lagring.
  • Filerna som måste överföras måste vara världslästa.

I den här handledningen använder vi API för Android Beam-filöverföring i Android SDK för att skapa en applikation som gör det möjligt för användare att dela filer mellan enheter.

3. Krav

På grund av emulatorens begränsningar måste applikationen testas med två fysiska NFC-aktiverade Android-enheter som kör Android 4.1 eller högre.

4. Komma igång

Använd Eclipse, skapa ett nytt Android-applikationsprojekt och namnge det NFCDemo

Eftersom Android Beam-filöverföring endast är tillgänglig på enheter som kör Android 4.1+ måste vi ställa in Minimikrav SDK till API 16: Android 4.1 (Jelly Bean).

5. Konfigurera manifestfilen

För att kunna använda NFC i en Android-app måste vi förklara NFC-tillståndet i manifestfilen enligt nedan.

Dessutom, för att läsa filer från extern lagring, förklara READ_EXTERNAL_STORAGE tillstånd enligt nedan.

 

Inte alla Android-enheter stöder NFC. För att se till att vår app bara visas i Google Play för de enheter som stödjer NFC, lägg till  element till manifestfilen.

Om NFC är en valfri funktion i din app kan du släppa bort den element från manifestfilen och ställ in minsta SDK-versionen till en lägre API-nivå. I så fall måste du kontrollera om enheten stöder NFC och Android Beam API, och uppdatera användargränssnittet i enlighet med detta.

6. Skapa layouter

Öppna activity_main.xml layoutfil och lägg till en Knapp enligt nedanstående. Som du kan se har vi lagt till en Knapp som användaren kan knacka på för att initiera överföring av en fil.

 

7. Implementera filöverföring

Öppna Huvudaktivitet klass och ersätt nuvarande genomförande med den som visas nedan. Oroa dig inte för genomförandet för nu. Jag ska förklara varje steg i ett ögonblick.

paketet com.tutsplus.nfcdemo; importera java.io.File; importera android.app.Activity; importera android.content.Intent; importera android.content.pm.PackageManager; importera android.net.Uri; importera android.nfc.NfcAdapter; importera android.os.Build; importera android.os.Bundle; importera android.os.Environment; importera android.provider.Settings; importera android.view.View; importera android.widget.Toast; public class MainActivity utökar aktiviteten privat NfcAdapter nfcAdapter; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); PackageManager pm = this.getPackageManager (); // Kontrollera om NFC är tillgänglig på enheten om (! Pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC är inte tillgänglig på enheten. Toast.makeText (detta, "Enheten har inte NFC-maskinvara.", Toast.LENGTH_SHORT) .show ();  // Kontrollera om enheten kör Android 4.1 eller senare om (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. Testa appen

Innan vi dyker in i koden, låt oss se vilka steg vi behöver ta för att överföra en fil från en enhet till en annan.

Steg 1

Anslut en av de två Android-enheterna till din utvecklingsarbetsstation via USB med USB felsökning aktiverad. Låt oss hänvisa till den enheten som avsändare.

Steg 2

Gör det möjligt NFC och Android Beam på avsändaren. Tryck F11 att felsöka ansökan. Detta kommer att installeras och startas NFCDemo på avsändaren.

Steg 3

Gör det möjligt NFC på den andra enheten mottagare.

Steg 4

Tryck på Skicka Fil knappen och placera enheterna nära varandra för att låta NFC göra sitt arbete. Du borde se en Tryck för att stråla Meddelandet visas på avsändaren. Tryck på skärmen för att initiera överföringen.

Steg 5

Mottagaren ska visa en anmälan i statusfältet för att ange framstegen i filöverföringen.

 

Steg 6

Om filöverföringen är klar lyckades a Beam färdig Meddelandet visas till användaren.

9. Avkodning av koden

Låt oss ta en titt på koden som gör allt detta möjligt.

Bestäm Device Capabilities

Som nämnts tidigare, om NFC är en valfri funktion i vår app, bör vi kontrollera NFC- och Android Beam-support. Denna kontroll kan utföras var som helst i vår app. I det här exemplet har jag satt koden i onCreate metod för Huvudaktivitet klass.

Steg 1

Hämta en hänvisning till Package.

PackageManager pm = this.getPackageManager ();

De Package klassen innehåller information om alla paket som är installerade på enheten.

Steg 2

Ring hasSystemFeature metod på Package föremål för att avgöra om enheten har NFC-stöd. Denna metod returnerar Sannom den önskade funktionen stöds av enheten.

om (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC är inte tillgängligt på enheten.  else // NFC är tillgängligt på enheten. 

Steg 3

Om enheten har NFC-support måste vi kontrollera enhetens Android-version. Android-versionen (API-nivå) som körs på en enhet är tillgänglig via  android.os.Build.VERSION.SDK_INT. Om versionen är större än eller lika med 16, Build.VERSION_CODES.JELLY_BEAN, då stöder enheten Android Beam-filöverföring.

om (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC är inte tillgängligt på enheten.  // Kontrollera om enheten kör Android 4.1 eller senare om (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)  // Android Beam feature is not supported.  else  // NFC and Android Beam file transfer is supported. 

Starta filöverföring

När vi väl har bestämt att enheten har nödvändiga funktioner kan vi initiera filöverföringen med Android Beam.

Steg 1

Hämta en hänvisning till NfcAdapter.

nfcAdapter = NfcAdapter.getDefaultAdapter (detta); 

Arbetet hos NfcAdapter är att hantera utbytet av data mellan en NFC-tagg och en NFC-aktiverad enhet eller mellan två NFC-aktiverade enheter.

Steg 2

Adaptern kan aktiveras eller inaktiveras. Om du vill avgöra om adaptern är aktiverad, ringa isEnabled metod på NfcAdapter objekt.

// Kontrollera om NFC är aktiverad på enheten om (! NfcAdapter.isEnabled ()) // NFC är avstängd, visa inställningsgränssnittet för att aktivera NFC else // NFC är aktiverat

Denna metod returnerar Sannom NFC är aktiverat på enheten. Om NFC är inaktiverat uppmanar vi användaren att aktivera den och visa användargränssnittet för NFC-inställningar. 

startActivity (new Intent (Settings.ACTION_NFC_SETTINGS));

Steg 3

På samma sätt kan Android Beam-funktionen också aktiveras eller inaktiveras. För att kontrollera dess tillstånd, ringa isNdefPushEnabled metod på NfcAdapter objekt.

// Kontrollera om NFC är aktiverad på enheten om (! NfcAdapter.isEnabled ()) // NFC är inaktiverat, visa inställningsgränssnittet för att aktivera NFC // Kontrollera om Android Beam-funktionen är aktiverad på enheten annars om (! NfcAdapter. isNdefPushEnabled ()) // Android Beam är inaktiverad, visa inställningsgränssnittet för att aktivera Android Beam else // NFC och Android Beam båda är aktiverade

Om denna metod returnerar falsk, Vi uppmanar användaren att aktivera den och visa användargränssnittet för Android Beam Settings.

startActivity (ny Intent (Settings.ACTION_NFCSHARING_SETTINGS));

Om både NFC och Android Beam är aktiverade kan vi fortsätta med filöverföringen.

Steg 4

Skapa en ny Fil använder katalogen där filen finns på enheten och namnet på filen. För att testa filöverföringen har jag lagt till en bild som heter wallpaper.png i Bilder katalog i extern lagring.

// Skapa en ny fil med den angivna katalogen och namnet Fil fileToTransfer = ny fil (filkatalog, filnamn);

Steg 5

Ring setBeamPushUris metod på NfcAdapter objekt och skicka URI av filen som ska överföras.

nfcAdapter.setBeamPushUris (ny Uri [] Uri.fromFile (fileToTransfer), detta);

De setBeamPushUris Metoden accepterar en uppsättning av Uri objekt. Om du vill skicka mer än en fil kan du skicka flera URI till adaptern.

URI: erna passerade till setBeamPushUris Metoden köpas av adaptern och överförs till mottagningsanordningen så snart den kommer i närheten av sändningsanordningen.

Slutsats

I denna handledning lärde du dig om grunderna för NFC på Android. Du har också lärt dig hur du begränsar åtkomsten till en app av ostödda enheter med hjälp av manifestfilen och bestämmer enhetens kapacitet vid körning. För att skicka filer med hjälp av NFC utnyttjade vi NfcAdapter klass.

Medan jag har försökt att täcka grunderna i att arbeta med Android Beam-filöverförings API för att hjälpa dig att komma igång, finns det fortfarande mer undersökning. Om du vill lära dig mer, uppmanar jag dig att besöka Android-utvecklarportalen för mer information.