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.
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:
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.
Android Beam Data Exchange-funktionen har två API: er, NDEF-överföring API och Filöverföring 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.
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:
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.
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.
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).
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.
Ö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.
Ö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);
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.
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.
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.
Gör det möjligt NFC på den andra enheten mottagare.
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.
Mottagaren ska visa en anmälan i statusfältet för att ange framstegen i filöverföringen.
Om filöverföringen är klar lyckades a Beam färdig Meddelandet visas till användaren.
Låt oss ta en titt på koden som gör allt detta möjligt.
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.
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.
Ring hasSystemFeature
metod på Package
föremål för att avgöra om enheten har NFC-stöd. Denna metod returnerar Sann
om 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.
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.
När vi väl har bestämt att enheten har nödvändiga funktioner kan vi initiera filöverföringen med Android Beam.
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.
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 Sann
om 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));
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.
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);
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.
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.