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.
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:
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.
Die Datenaustauschfunktion von Android Beam verfügt über zwei APIs, die NDEF-Übertragung API und die Datei Übertragung 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.
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:
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.
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.
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).
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.
Ö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.
Ö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);
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.
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.
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.
Aktivieren NFC auf dem zweiten Gerät die Empfänger.
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.
Der Empfänger sollte eine Benachrichtigung in der Statusleiste anzeigen, um den Fortschritt der Dateiübertragung anzuzeigen.
Wenn die Dateiübertragung erfolgreich abgeschlossen wurde, a Beam komplett Nachricht wird dem Benutzer angezeigt.
Schauen wir uns den Code an, der all dies ermöglicht.
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.
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.
Ruf den hasSystemFeature
Methode auf der Paket-Manager
Objekt, um festzustellen, ob das Gerät NFC-Unterstützung hat. Diese Methode kehrt zurück wahr
wenn 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.
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.
Sobald wir festgestellt haben, dass das Gerät über die erforderlichen Funktionen verfügt, können wir die Dateiübertragung mit Android Beam initiieren.
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.
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 wahr
wenn 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));
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.
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);
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.
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.