In deze tutorial leert u de basisprincipes van P2P (peer-to-peer) communicatie en maakt u een applicatie om grote bestanden, zoals afbeeldingen en video's, van het ene apparaat naar het andere te delen met behulp van NFC (near field communication) op Android.
NFC of Near Field Communication is een verzameling draadloze technologieën voor korte afstanden. Het maakt de uitwisseling van gegevens mogelijk tussen een NFC-tag en een NFC-compatibel apparaat, of tussen NFC-compatibele apparaten binnen een afstand van niet meer dan 4 cm.
Er zijn drie manieren van NFC-bediening:
De peer-to-peer (P2P) -functie voor gegevensuitwisseling is toegevoegd aan Android in API-niveau 14 (Android 4.0, Ice Cream Sandwich) en wordt genoemd Android Beam. Het maakt snelle gegevensuitwisseling op korte termijn mogelijk tussen twee Android-apparaten met NFC-ondersteuning.
De Android Beam-functie voor gegevensuitwisseling heeft twee API's, de NDEF-overdracht API en de bestandsoverdracht API.
Deze API is geïntroduceerd op API-niveau 14 (Android 4.0, Ice Cream Sandwich) en maakt de overdracht van kleine hoeveelheden gegevens mogelijk, zoals URL's, contacten, enzovoort. De gegevens die moeten worden overgedragen, moeten zijn geformatteerd in NDEF (NFC Data Exchange Format) en is verzonden als een NDEF-bericht.
De API voor bestandsoverdracht is geïntroduceerd in API-niveau 16 (Android 4.1, Jelly Bean) en maakt de overdracht van grote bestanden mogelijk, zoals afbeeldingen, video's, enzovoort.
Er zijn echter enkele kanttekeningen. Android Beam werkt alleen wanneer de toepassing die de gegevens verzendt op de voorgrond wordt uitgevoerd en het apparaat dat de gegevens ontvangt, is ontgrendeld.
De Android Beam-API voor bestandsoverdracht heeft twee aanvullende vereisten:
In deze zelfstudie gebruiken we de Android Beam-API voor bestandsoverdracht van de Android SDK om een toepassing te maken waarmee gebruikers bestanden kunnen delen tussen apparaten.
Vanwege de beperkingen van de emulator, moet de toepassing worden getest met twee fysieke NFC-compatibele Android-apparaten met Android 4.1 of hoger.
Gebruik Eclipse om een nieuw Android-applicatieproject te maken en een naam te geven NFCDemo.
Omdat Android Beam-bestandsoverdracht alleen beschikbaar is op apparaten met Android 4.1 of hoger, moeten we instellen Minimaal vereiste SDK naar API 16: Android 4.1 (Jelly Bean).
Als u NFC in een Android-app wilt gebruiken, moeten we de NFC-machtiging in het manifestbestand declareren, zoals hieronder wordt weergegeven.
Als u bestanden van externe opslag wilt lezen, moet u bovendien de READ_EXTERNAL_STORAGE
toestemming zoals hieronder getoond.
Niet elk Android-apparaat ondersteunt NFC. Om ervoor te zorgen dat onze app alleen wordt weergegeven in Google Play voor apparaten die NFC ondersteunen, voegt u de
element in het manifestbestand.
Als NFC een optionele functie van uw app is, kunt u de
element uit het manifestbestand en stel de minimale SDK-versie in op een lager API-niveau. In dat geval moet u controleren of het apparaat NFC en de Android Beam API ondersteunt en dienovereenkomstig de gebruikersinterface bijwerken.
Open de activity_main.xml
lay-outbestand en voeg een toe Knop
zoals hieronder getoond. Zoals u kunt zien, hebben we een toegevoegd Knop
dat de gebruiker kan tikken om de overdracht van een bestand te starten.
Open de Hoofdactiviteit
class en vervang de huidige implementatie door de hieronder getoonde. Maak je geen zorgen over de implementatie voor nu. Ik zal elke stap in een ogenblik uitleggen.
pakket com.tutsplus.nfcdemo; importeer java.io.File; import android.app.Activity; importeer android.content.Intent; importeer android.content.pm.PackageManager; import android.net.Uri; importeer android.nfc.NfcAdapter; import android.os.Build; import android.os.Bundle; import android.os.Environment; importeer android.provider.Settings; import android.view.View; import android.widget.Toast; public class MainActivity breidt activiteit uit private NfcAdapter nfcAdapter; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); PackageManager pm = this.getPackageManager (); // Controleer of NFC beschikbaar is op apparaat als (! Pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC niet beschikbaar is op het apparaat. Toast.makeText (dit: "Het apparaat heeft geen NFC-hardware.", Toast.LENGTH_SHORT) .show (); // Controleer of apparaat Android 4.1 of hoger wordt uitgevoerd anders (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);
Voordat we ons verdiepen in de code, laten we zien welke stappen we moeten nemen om een bestand van het ene naar het andere apparaat over te brengen.
Verbind een van de twee Android-apparaten met uw ontwikkelwerkstation via USB met USB debugging ingeschakeld. Laten we naar dat apparaat verwijzen als het afzender.
in staat stellen NFC en Android Beam op de afzender. druk op F11 om de applicatie te debuggen. Dit zal installeren en starten NFCDemo op de afzender.
in staat stellen NFC op het tweede apparaat, de ontvanger.
Druk op Verstuur bestand knop en plaats de apparaten dicht bij elkaar om NFC zijn werk te laten doen. Je zou een a moeten zien Tik om te beamen bericht verschijnt op de afzender. Tik op het scherm om de overdracht te starten.
De ontvanger moet een melding in de statusbalk weergeven om de voortgang van de bestandsoverdracht aan te geven.
Als de bestandsoverdracht met succes is voltooid, Beam compleet bericht wordt getoond aan de gebruiker.
Laten we eens kijken naar de code die dit allemaal mogelijk maakt.
Zoals eerder vermeld, moeten we controleren of NFC en Android Beam-ondersteuning zijn als NFC een optionele functie van onze app is. Deze controle kan overal in onze app worden uitgevoerd. In dit voorbeeld heb ik de code in de onCreate
methode van de Hoofdactiviteit
klasse.
Vraag een verwijzing naar de Pakket manager
.
PackageManager pm = this.getPackageManager ();
De Pakket manager
klasse bevat informatie over alle pakketten die op het apparaat zijn geïnstalleerd.
Bel de hasSystemFeature
methode op de Pakket manager
object om te bepalen of het apparaat NFC-ondersteuning heeft. Deze methode retourneert waar
als de gewenste functie door het apparaat wordt ondersteund.
if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC is niet beschikbaar op het apparaat. else // NFC is beschikbaar op het apparaat.
Als het apparaat NFC-ondersteuning heeft, moeten we de Android-versie van het apparaat controleren. De Android-versie (API-niveau) die op een apparaat wordt uitgevoerd, is beschikbaar via android.os.Build.VERSION.SDK_INT
. Als de versie groter is dan of gelijk is aan 16, Build.VERSION_CODES.JELLY_BEAN
, vervolgens ondersteunt het apparaat Android Beam-bestandsoverdracht.
if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC is niet beschikbaar op het apparaat. // Controleer of apparaat Android 4.1 of hoger wordt uitgevoerd anders (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) // Android Beam feature is not supported. else // NFC and Android Beam file transfer is supported.
Zodra we hebben vastgesteld dat het apparaat over de vereiste mogelijkheden beschikt, kunnen we de bestandsoverdracht starten met Android Beam.
Vraag een verwijzing naar de NfcAdapter
.
nfcAdapter = NfcAdapter.getDefaultAdapter (this);
De taak van de NfcAdapter
is om de uitwisseling van gegevens te beheren tussen een NFC-tag en een NFC-compatibel apparaat of tussen twee NFC-compatibele apparaten.
De adapter kan worden ingeschakeld of uitgeschakeld. Om te bepalen of de adapter is ingeschakeld, belt u de is ingeschakeld
methode op de NfcAdapter
voorwerp.
// Controleer of NFC is ingeschakeld op apparaat als (! NfcAdapter.isEnabled ()) // NFC is uitgeschakeld, toon de instellingen UI om NFC in te schakelen else // NFC is ingeschakeld
Deze methode retourneert waar
als NFC is ingeschakeld op het apparaat. Als NFC is uitgeschakeld, vragen we de gebruiker om dit in te schakelen en de gebruikersinterface van de NFC-instellingen weer te geven.
startActivity (new Intent (Settings.ACTION_NFC_SETTINGS));
Op dezelfde manier kan de Android Beam-functie ook worden ingeschakeld of uitgeschakeld. Als u de status ervan wilt controleren, belt u met isNdefPushEnabled
methode op de NfcAdapter
voorwerp.
// Controleer of NFC op het apparaat is ingeschakeld als (! NfcAdapter.isEnabled ()) // NFC is uitgeschakeld, de gebruikersinterface van de instellingen weergeven om NFC in te schakelen // Controleer of Android Beam-functie op apparaat anders is ingeschakeld als (! NfcAdapter. isNdefPushEnabled ()) // Android Beam is uitgeschakeld, toont de instellingen UI om Android Beam in te schakelen else // NFC en Android Beam beide zijn ingeschakeld
Als deze methode terugkeert vals
, we vragen de gebruiker om deze in te schakelen en de gebruikersinterface van de Android Beam-instellingen te tonen.
startActivity (new Intent (Settings.ACTION_NFCSHARING_SETTINGS));
Als zowel NFC als Android Beam zijn ingeschakeld, kunnen we doorgaan met de bestandsoverdracht.
Maak een nieuw het dossier
met behulp van de map waar het bestand zich op het apparaat bevindt en de naam van het bestand. Om de bestandsoverdracht te testen, heb ik een afbeelding met de naam wallpaper.png in de Afbeeldingen map in de externe opslag.
// Maak een nieuw bestand met de opgegeven map en naam Bestand fileToTransfer = nieuw bestand (bestandsdirectory, bestandsnaam);
Bel de setBeamPushUris
methode op de NfcAdapter
object en geef de URI door van het bestand dat moet worden overgedragen.
nfcAdapter.setBeamPushUris (nieuwe Uri [] Uri.fromFile (fileToTransfer), this);
De setBeamPushUris
methode accepteert een array van Uri
voorwerpen. Als u meer dan één bestand wilt verzenden, kunt u meerdere URI's naar de adapter sturen.
De URI's zijn doorgegeven aan de setBeamPushUris
methode worden in de wachtrij geplaatst door de adapter en worden overgebracht naar het ontvangende apparaat zodra het in de nabijheid van het verzendende apparaat komt.
In deze zelfstudie hebt u geleerd over de basisprincipes van NFC op Android. U hebt ook geleerd hoe u de toegang tot een app kunt beperken door niet-ondersteunde apparaten die het manifestbestand gebruiken en de apparaatmogelijkheden tijdens runtime bepalen. Voor het verzenden van bestanden met NFC maakten we gebruik van de NfcAdapter
klasse.
Hoewel ik geprobeerd heb om de basisprincipes van werken met de Android Beam-bestandsoverdracht-API te bespreken om u op weg te helpen, is er nog meer onderzoek. Als u meer wilt weten, raad ik u aan de Android-ontwikkelaarportal te bezoeken voor meer informatie.