Freigeben von Dateien mit NFC auf Android

In diesem Lernprogramm lernen Sie die Grundlagen der P2P-Kommunikation (Peer-to-Peer) kennen und erstellen eine Anwendung, um große Dateien (z. B. Bilder und Videos) mithilfe von NFC (Near Field Communication) unter Android von einem Gerät auf ein anderes zu übertragen.

1. Einleitung

NFC oder Near Field Communication ist eine Reihe von drahtlosen Technologien mit kurzer Reichweite. Es ermöglicht den Datenaustausch zwischen einem NFC-Tag und einem NFC-fähigen Gerät oder zwischen NFC-fähigen Geräten im Abstand von höchstens 4 cm.

Es gibt drei Modi für den NFC-Betrieb:

  • Kontaktlose Tags lesen und schreiben: Diese Tags sind im Allgemeinen sehr klein und benötigen keine Batterie. Sie können in alle möglichen Objekte eingebettet werden, z. B. in Filmplakate, Produkte, Aufkleber usw..
  • Kartenemulationsmodus: Denken Sie intelligente Kreditkarten. Dadurch kann ein Android-Gerät wie eine Smartcard agieren. Der offensichtliche Vorteil davon ist, dass Ihr Gerät wie eine Karte fungieren kann und sich dann auf Knopfdruck wie eine andere Karte verhält. Auf diese Weise kann ein Android-Gerät Ihre Geldbörse ersetzen. Egal, welche Kreditkarte, Buskarte oder Ticket Sie verwenden, Ihr Android-Gerät könnte diesen Gegenstand - natürlich sicher - als Personifizieren. Der Leser auf der anderen Seite der Transaktion meint, dass er mit diesem Objekt interagiert, obwohl es sich tatsächlich um ein Android-Gerät handelt.
  • Peer-to-Peer-Kommunikation: Jede Seite erkennt, dass sie mit einem anderen Gerät spricht und nicht nur mit einem Tag. Das Protokoll wurde von Google entwickelt und ermöglicht es zwei Geräten, Nachrichten hin und her zu senden.

Die Peer-to-Peer-Datenaustauschfunktion (P2P) wurde in API-Level 14 (Android 4.0, Ice Cream Sandwich) zu Android hinzugefügt und heißt Android Beam. Es ermöglicht einen schnellen Datenaustausch im Nahbereich zwischen zwei NFC-fähigen Android-Geräten.

2. P2P-Kommunikation mit Android Beam

Die Datenaustauschfunktion von Android Beam verfügt über zwei APIs, die NDEF-Übertragung API und die Datei Übertragung API.

NDEF-Übertragungs-API

Diese API wurde in API Level 14 (Android 4.0, Ice Cream Sandwich) eingeführt und ermöglicht die Übertragung kleiner Datenmengen wie URLs, Kontakte usw. Die zu übertragenden Daten müssen in NDEF (NFC Data Exchange Format) formatiert sein und werden als NDEF-Nachricht gesendet.

Dateiübertragungs-API

Die Dateiübertragungs-API wurde in API-Ebene 16 (Android 4.1, Jelly Bean) eingeführt und ermöglicht die Übertragung großer Dateien wie Bilder, Videos usw.

Es gibt jedoch einige Einschränkungen. Android Beam funktioniert nur, wenn die Anwendung, die die Daten sendet, im Vordergrund ausgeführt wird und das Gerät, das die Daten empfängt, entsperrt ist.

Die Android Beam-Dateiübertragungs-API hat zwei zusätzliche Anforderungen:

  • Die zu übertragenden Dateien müssen sich im externen Speicher befinden.
  • Die Dateien, die übertragen werden müssen, müssen weltweit lesbar sein.

In diesem Lernprogramm verwenden wir die Android Beam-Dateiübertragungs-API des Android SDK, um eine Anwendung zu erstellen, mit der Benutzer Dateien zwischen Geräten gemeinsam nutzen können.

3. Anforderungen

Aufgrund der Einschränkungen des Emulators muss die Anwendung mit zwei physischen NFC-fähigen Android-Geräten getestet werden, auf denen Android 4.1 oder höher ausgeführt wird.

4. Erste Schritte

Erstellen Sie mit Eclipse ein neues Android-Anwendungsprojekt und benennen Sie es NFCDemo

Da die Übertragung von Android Beam-Dateien nur auf Geräten verfügbar ist, auf denen Android 4.1 oder höher ausgeführt wird, müssen wir die Einstellung vornehmen Minimum Erforderliches SDK zu API 16: Android 4.1 (Jelly Bean).

5. Manifestdatei konfigurieren

Um NFC in einer Android-App verwenden zu können, müssen Sie die NFC-Berechtigung in der Manifestdatei wie unten angegeben deklarieren.

Um Dateien aus einem externen Speicher zu lesen, geben Sie außerdem das an READ_EXTERNAL_STORAGE Erlaubnis wie unten gezeigt.

 

Nicht jedes Android-Gerät unterstützt NFC. Fügen Sie das hinzu, um sicherzustellen, dass unsere App nur für Geräte angezeigt wird, die NFC unterstützen  Element zur Manifestdatei.

Wenn NFC eine optionale Funktion Ihrer App ist, können Sie die Option weglassen Element aus der Manifestdatei und setzen Sie die minimale SDK-Version auf eine niedrigere API-Ebene. In diesem Fall müssen Sie prüfen, ob das Gerät NFC und die Android Beam-API unterstützt, und die Benutzeroberfläche entsprechend aktualisieren.

6. Layouts erstellen

Öffne das activity_main.xml Layoutdatei und fügen Sie ein Taste Wie nachfolgend dargestellt. Wie Sie sehen können, haben wir ein hinzugefügt Taste Der Benutzer kann darauf tippen, um die Übertragung einer Datei zu initiieren.

 

7. Dateiübertragung implementieren

Öffne das Hauptaktivität Klasse und ersetzen Sie die aktuelle Implementierung durch die unten gezeigte. Machen Sie sich jetzt keine Sorgen um die Implementierung. Ich erkläre jeden Schritt gleich.

Paket com.tutsplus.nfcdemo; import java.io.File; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.nfc.NfcAdapter; import android.os.Build; import android.os.Bundle; import android.os.Environment; Import android.provider.Einstellungen; Import android.view.View; import android.widget.Toast; public class MainActivity erweitert Activity private NfcAdapter nfcAdapter; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); PackageManager pm = this.getPackageManager (); // Prüfen Sie, ob NFC auf dem Gerät verfügbar ist, wenn (! Pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC auf dem Gerät nicht verfügbar ist. Toast.makeText ("Das Gerät hat keine NFC-Hardware.", Toast.LENGTH_SHORT) .show ();  // Prüfen Sie, ob auf dem Gerät Android 4.1 oder höher ausgeführt wird, ansonsten if (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 der App

Bevor wir in den Code eintauchen, sehen wir uns an, welche Schritte erforderlich sind, um eine Datei von einem Gerät auf ein anderes zu übertragen.

Schritt 1

Verbinden Sie eines der beiden Android-Geräte über USB mit Ihrer Entwicklungs-Workstation USB-Debugging aktiviert. Wir bezeichnen dieses Gerät als das Absender.

Schritt 2

Aktivieren NFC und Android Beam auf dem Absender. Drücken Sie F11 um die Anwendung zu debuggen. Dies wird installiert und gestartet NFCDemo auf dem Absender.

Schritt 3

Aktivieren NFC auf dem zweiten Gerät die Empfänger.

Schritt 4

Tippen Sie auf die Datei senden und positionieren Sie die Geräte nahe beieinander, damit NFC seine Arbeit erledigen kann. Sie sollten ein sehen Berühren Sie, um zu strahlen Nachricht erscheint auf dem Absender. Tippen Sie auf den Bildschirm, um die Übertragung zu starten.

Schritt 5

Der Empfänger sollte eine Benachrichtigung in der Statusleiste anzeigen, um den Fortschritt der Dateiübertragung anzuzeigen.

 

Schritt 6

Wenn die Dateiübertragung erfolgreich abgeschlossen wurde, a Beam komplett Nachricht wird dem Benutzer angezeigt.

9. Kodierung des Codes

Schauen wir uns den Code an, der all dies ermöglicht.

Bestimmen Sie die Gerätefunktionen

Wie bereits erwähnt, sollten wir, wenn NFC eine optionale Funktion unserer App ist, nach Unterstützung für NFC und Android Beam suchen. Diese Prüfung kann an beliebiger Stelle in unserer App durchgeführt werden. In diesem Beispiel habe ich den Code in die onCreate Methode der Hauptaktivität Klasse.

Schritt 1

Beziehen Sie einen Verweis auf die Paket-Manager.

PackageManager pm = this.getPackageManager ();

Das Paket-Manager class enthält Informationen zu allen auf dem Gerät installierten Paketen.

Schritt 2

Ruf den hasSystemFeature Methode auf der Paket-Manager Objekt, um festzustellen, ob das Gerät NFC-Unterstützung hat. Diese Methode kehrt zurück wahrwenn die gewünschte Funktion vom Gerät unterstützt wird.

if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC ist auf dem Gerät nicht verfügbar.  else // NFC ist auf dem Gerät verfügbar. 

Schritt 3

Wenn das Gerät NFC-Unterstützung hat, müssen wir die Android-Version des Geräts überprüfen. Die auf einem Gerät ausgeführte Android-Version (API-Ebene) ist über verfügbar  android.os.Build.VERSION.SDK_INT. Wenn die Version größer oder gleich 16 ist, Build.VERSION_CODES.JELLY_BEAN, dann unterstützt das Gerät die Übertragung von Android Beam-Dateien.

if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC ist auf dem Gerät nicht verfügbar.  // Prüfen Sie, ob auf dem Gerät Android 4.1 oder höher ausgeführt wird, ansonsten if (Build.VERSION.SDK_INT.) < Build.VERSION_CODES.JELLY_BEAN)  // Android Beam feature is not supported.  else  // NFC and Android Beam file transfer is supported. 

Dateiübertragung einleiten

Sobald wir festgestellt haben, dass das Gerät über die erforderlichen Funktionen verfügt, können wir die Dateiübertragung mit Android Beam initiieren.

Schritt 1

Beziehen Sie einen Verweis auf die NfcAdapter.

nfcAdapter = NfcAdapter.getDefaultAdapter (this); 

Der Job der NfcAdapter soll den Datenaustausch zwischen einem NFC-Tag und einem NFC-fähigen Gerät oder zwischen zwei NFC-fähigen Geräten verwalten.

Schritt 2

Der Adapter kann aktiviert oder deaktiviert werden. Um festzustellen, ob der Adapter aktiviert ist, rufen Sie die aktiviert Methode auf der NfcAdapter Objekt.

// Überprüfen Sie, ob NFC auf dem Gerät aktiviert ist, wenn (! NfcAdapter.isEnabled ()) // NFC deaktiviert ist. Zeigen Sie die Benutzeroberfläche für die Einstellungen an, um NFC zu aktivieren. Else // NFC ist aktiviert.

Diese Methode kehrt zurück wahrwenn NFC auf dem Gerät aktiviert ist. Wenn NFC deaktiviert ist, fordern wir den Benutzer auf, ihn zu aktivieren und die Benutzeroberfläche der NFC-Einstellungen anzuzeigen. 

startActivity (neue Absicht (Settings.ACTION_NFC_SETTINGS));

Schritt 3

Ebenso kann die Android-Beam-Funktion aktiviert oder deaktiviert werden. Um den Status zu überprüfen, rufen Sie die isNdefPushEnabled Methode auf der NfcAdapter Objekt.

// Prüfen Sie, ob NFC auf dem Gerät aktiviert ist, wenn (! NfcAdapter.isEnabled ()) // NFC ist deaktiviert, zeigen Sie die Einstellungen der Benutzeroberfläche an, um NFC zu aktivieren // Überprüfen Sie, ob die Android-Beam-Funktion auf dem Gerät aktiviert ist. isNdefPushEnabled ()) // Android Beam ist deaktiviert. Zeigen Sie die Benutzeroberfläche für die Einstellungen an, um den Android Beam zu aktivieren. else // NFC und Android Beam sind beide aktiviert.

Wenn diese Methode zurückgegeben wird falsch, Wir fordern den Benutzer auf, ihn zu aktivieren und die Benutzeroberfläche der Android-Beam-Einstellungen anzuzeigen.

startActivity (neuer Intent (Settings.ACTION_NFCSHARING_SETTINGS));

Wenn sowohl NFC als auch Android Beam aktiviert sind, können Sie mit der Dateiübertragung fortfahren.

Schritt 4

Erstelle eine neue Datei Verwenden Sie das Verzeichnis, in dem sich die Datei auf dem Gerät befindet, und den Namen der Datei. Um die Dateiübertragung zu testen, habe ich ein Bild mit dem Namen hinzugefügt wallpaper.png in dem Bilder Verzeichnis im externen Speicher.

// Eine neue Datei mit dem angegebenen Verzeichnis und Namen erstellen File fileToTransfer = new File (fileDirectory, Dateiname);

Schritt 5

Ruf den setBeamPushUris Methode auf der NfcAdapter object und übergeben Sie die URI der zu übertragenden Datei.

nfcAdapter.setBeamPushUris (neuer Uri [] Uri.fromFile (fileToTransfer), this);

Das setBeamPushUris Methode akzeptiert ein Array von Uri Objekte. Wenn Sie mehrere Dateien senden möchten, können Sie dem Adapter mehrere URIs übergeben.

Die URIs wurden an den übergeben setBeamPushUris Verfahren werden vom Adapter in die Warteschlange gestellt und an das empfangende Gerät übertragen, sobald es sich in unmittelbarer Nähe des sendenden Geräts befindet.

Fazit

In diesem Lernprogramm haben Sie die Grundlagen von NFC unter Android kennen gelernt. Sie haben auch gelernt, wie Sie den Zugriff auf eine App durch nicht unterstützte Geräte mithilfe der Manifestdatei einschränken und die Gerätefunktionen zur Laufzeit bestimmen. Um Dateien über NFC zu versenden, haben wir die NfcAdapter Klasse.

Ich habe zwar versucht, die Grundlagen der Arbeit mit der Android Beam-Dateiübertragungs-API zu erläutern, um Ihnen den Einstieg zu erleichtern. Wenn Sie mehr erfahren möchten, sollten Sie das Android-Entwicklerportal besuchen, um weitere Informationen zu erhalten.