Bestanden delen met NFC op Android

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.

1. Inleiding

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:

  • Lezen en contactloze tags schrijven: Deze tags zijn over het algemeen erg klein en vereisen geen batterijvermogen. Ze kunnen worden ingebed in allerlei soorten objecten, zoals filmposters, producten, stickers enzovoort.
  • Kaartemulatiemodus: Denk aan slimme creditcards. Hierdoor kan een Android-apparaat zich gedragen als een smartcard. Het voor de hand liggende voordeel hiervan is dat uw apparaat zich als één kaart kan gedragen en zich dan als een andere kan gedragen met één druk op de knop. Dit is een manier waarop een Android-apparaat je portemonnee kan vervangen. Welke creditcard, buskaart of ticket u ook gebruikt, uw Android-apparaat kan zich - uiteraard veilig - voordoen als dat item. De lezer aan de andere kant van de transactie denkt dat hij interactie heeft met dat item, terwijl het in feite om een ​​Android-apparaat gaat.
  • Peer-to-peer communicatie: Elke zijde herkent dat het met een ander apparaat praat en niet alleen met een tag. Het protocol is ontwikkeld door Google en staat twee apparaten toe om berichten heen en weer te sturen.

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.

2. P2P-communicatie met Android Beam

De Android Beam-functie voor gegevensuitwisseling heeft twee API's, de NDEF-overdracht API en de bestandsoverdracht API.

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

File Transfer API

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:

  • De bestanden die moeten worden overgedragen, moeten zich in een externe opslag bevinden.
  • De bestanden die moeten worden overgedragen, moeten wereldwijd leesbaar zijn.

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.

3. Vereisten

Vanwege de beperkingen van de emulator, moet de toepassing worden getest met twee fysieke NFC-compatibele Android-apparaten met Android 4.1 of hoger.

4. Aan de slag

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

5. Manifest File configureren

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.

6. Layouts maken

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.

 

7. Implementeren van bestandsoverdracht

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

8. Testen van de app

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.

Stap 1

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.

Stap 2

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.

Stap 3

in staat stellen NFC op het tweede apparaat, de ontvanger.

Stap 4

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.

Stap 5

De ontvanger moet een melding in de statusbalk weergeven om de voortgang van de bestandsoverdracht aan te geven.

 

Stap 6

Als de bestandsoverdracht met succes is voltooid, Beam compleet bericht wordt getoond aan de gebruiker.

9. Decodering van de code

Laten we eens kijken naar de code die dit allemaal mogelijk maakt.

Bepaal apparaatmogelijkheden

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.

Stap 1

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.

Stap 2

Bel de hasSystemFeature methode op de Pakket manager object om te bepalen of het apparaat NFC-ondersteuning heeft. Deze methode retourneert waarals 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. 

Stap 3

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. 

Start bestandsoverdracht

Zodra we hebben vastgesteld dat het apparaat over de vereiste mogelijkheden beschikt, kunnen we de bestandsoverdracht starten met Android Beam.

Stap 1

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.

Stap 2

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

Stap 3

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.

Stap 4

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

Stap 5

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.

Conclusie

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.