Dans ce tutoriel, vous apprendrez les bases de la communication P2P (peer-to-peer) et créerez une application permettant de partager des fichiers volumineux, tels que des images et des vidéos, d'un appareil à un autre à l'aide de la technologie NFC (communication en champ proche) sur Android..
NFC ou Communication en champ proche est un ensemble de technologies sans fil à courte portée. Il permet l'échange de données entre une balise NFC et un périphérique compatible NFC, ou entre des périphériques compatibles NFC situés à une distance maximale de 4 cm..
Il existe trois modes de fonctionnement NFC:
La fonctionnalité d'échange de données d'égal à égal (P2P) a été ajoutée à Android dans l'API de niveau 14 (Android 4.0, Ice Cream Sandwich) et est appelée Android Beam. Il permet l'échange rapide de données à courte portée entre deux appareils Android compatibles NFC.
La fonctionnalité d'échange de données Android Beam comporte deux API, la Transfert NDEF API et le transfert de fichier API.
Introduite au niveau 14 (Android 4.0, Ice Cream Sandwich), cette API permet le transfert de petites quantités de données telles que des URL, des contacts, etc. Les données à transférer doivent être au format NDEF (Format d'échange de données NFC). envoyé sous forme de message NDEF.
L'API de transfert de fichier a été introduite dans l'API de niveau 16 (Android 4.1, Jelly Bean) et permet le transfert de gros fichiers, tels que des images, des vidéos, etc..
Il y a cependant des mises en garde. Android Beam ne fonctionne que lorsque l'application qui envoie les données est exécutée au premier plan et que le périphérique recevant les données est déverrouillé.
L'API de transfert de fichiers Android Beam a deux exigences supplémentaires:
Dans ce didacticiel, nous allons utiliser l'API de transfert de fichiers Android Beam du SDK Android pour créer une application permettant aux utilisateurs de partager des fichiers entre appareils..
En raison des limitations de l'émulateur, l'application doit être testée avec deux périphériques Android physiques compatibles NFC fonctionnant sous Android 4.1 ou version ultérieure..
À l'aide d'Eclipse, créez un nouveau projet d'application Android et nommez-le. NFCDemo.
Le transfert de fichiers Android Beam n'étant disponible que sur les appareils fonctionnant sous Android 4.1+, nous devons définir: SDK minimum requis à API 16: Android 4.1 (Jelly Bean).
Pour utiliser NFC dans une application Android, nous devons déclarer l'autorisation NFC dans le fichier manifeste comme indiqué ci-dessous..
En outre, pour lire les fichiers du stockage externe, déclarez le READ_EXTERNAL_STORAGE
permission comme indiqué ci-dessous.
Tous les appareils Android ne prennent pas en charge la technologie NFC. Pour vous assurer que notre application apparaît uniquement dans Google Play pour les appareils prenant en charge NFC, ajoutez le paramètre
élément du fichier manifeste.
Si NFC est une fonctionnalité optionnelle de votre application, vous pouvez omettre le
élément du fichier manifeste et définissez la version minimale du SDK sur un niveau d’API inférieur. Dans ce cas, vous devez vérifier si l'appareil prend en charge NFC et l'API Android Beam et mettre à jour l'interface utilisateur en conséquence..
Ouvrez le activity_main.xml
fichier de mise en page et ajouter un Bouton
comme indiqué ci-dessous. Comme vous pouvez le voir, nous avons ajouté un Bouton
que l'utilisateur peut appuyer sur pour lancer le transfert d'un fichier.
Ouvrez le Activité principale
classe et remplacez l’implémentation actuelle par celle illustrée ci-dessous Ne vous inquiétez pas de la mise en œuvre pour le moment. Je vais expliquer chaque étape en un instant.
package com.tutsplus.nfcdemo; importer java.io.File; importer android.app.Activity; importer android.content.Intent; importer android.content.pm.PackageManager; importer android.net.Uri; importer android.nfc.NfcAdapter; importer android.os.Build; importer android.os.Bundle; importer android.os.Environment; importer android.provider.Settings; importer android.view.View; importer android.widget.Toast; Classe publique MainActivity étend Activity private NfcAdapter nfcAdapter; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); PackageManager pm = this.getPackageManager (); // Vérifiez si NFC est disponible sur le périphérique si (! Pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC n'est pas disponible sur le périphérique. Toast.makeText (this, "Le périphérique ne dispose pas du matériel NFC.", Toast.LENGTH_SHORT) .show (); // Vérifiez si le périphérique exécute Android 4.1 ou version ultérieure, sinon (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);
Avant de plonger dans le code, voyons les étapes à suivre pour transférer un fichier d'un périphérique à un autre.
Connectez l’un des deux appareils Android à votre poste de travail de développement via USB avec débogage USB activée. Appelons cet appareil le expéditeur.
Activer NFC et Android Beam sur l'expéditeur. presse F11 déboguer l'application. Cela installera et lancera NFCDemo sur l'expéditeur.
Activer NFC sur le deuxième appareil, le receveur.
Appuyez sur le Envoyer le fichier et positionnez les appareils les uns à côté des autres pour permettre à NFC de fonctionner. Vous devriez voir un Touchez pour transmettre message apparaît sur l'expéditeur. Touchez l'écran pour lancer le transfert.
Le destinataire doit afficher une notification dans la barre d'état pour indiquer la progression du transfert de fichier..
Si le transfert de fichier est terminé avec succès, un Faisceau complet le message est affiché à l'utilisateur.
Jetons un coup d'oeil au code qui rend tout cela possible.
Comme mentionné précédemment, si NFC est une fonctionnalité optionnelle de notre application, nous devrions vérifier la prise en charge de NFC et Android Beam. Cette vérification peut être effectuée n'importe où dans notre application. Dans cet exemple, j'ai mis le code dans le onCreate
méthode du Activité principale
classe.
Obtenir une référence à la Directeur chargé d'emballage
.
PackageManager pm = this.getPackageManager ();
le Directeur chargé d'emballage
La classe contient des informations sur tous les paquets installés sur le périphérique..
Appeler le hasSystemFeature
méthode sur le Directeur chargé d'emballage
objet pour déterminer si le périphérique prend en charge NFC. Cette méthode retourne vrai
si la fonctionnalité souhaitée est prise en charge par le périphérique.
if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC n'est pas disponible sur le périphérique. else // NFC est disponible sur le périphérique.
Si l'appareil prend en charge NFC, nous devons vérifier la version Android de l'appareil. La version Android (niveau API) exécutée sur un appareil est disponible via android.os.Build.VERSION.SDK_INT
. Si la version est supérieure ou égale à 16, Build.VERSION_CODES.JELLY_BEAN
, puis l'appareil prend en charge le transfert de fichiers Android Beam.
if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC n'est pas disponible sur le périphérique. // Vérifiez si le périphérique exécute Android 4.1 ou version ultérieure, sinon (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) // Android Beam feature is not supported. else // NFC and Android Beam file transfer is supported.
Une fois que nous avons déterminé que le périphérique dispose des capacités requises, nous pouvons lancer le transfert de fichier à l'aide d'Android Beam..
Obtenir une référence à la NfcAdapter
.
nfcAdapter = NfcAdapter.getDefaultAdapter (this);
Le métier de NfcAdapter
est de gérer l'échange de données entre une balise NFC et un périphérique compatible NFC ou entre deux périphériques compatibles NFC.
L'adaptateur peut être activé ou désactivé. Pour déterminer si l'adaptateur est activé, appelez le est autorisé
méthode sur le NfcAdapter
objet.
// Vérifie si la fonction NFC est activée sur le périphérique si (! NfcAdapter.isEnabled ()) // la fonction NFC est désactivée, affiche l'interface utilisateur des paramètres permettant d'activer la fonction NFC else // la fonction NFC est activée
Cette méthode retourne vrai
si NFC est activé sur le périphérique. Si la fonction NFC est désactivée, nous demandons à l'utilisateur de l'activer et d'afficher l'interface utilisateur des paramètres NFC..
startActivity (nouvelle intention (Settings.ACTION_NFC_SETTINGS));
De même, la fonctionnalité Android Beam peut également être activée ou désactivée. Pour vérifier son état, appelez le isNdefPushEnabled
méthode sur le NfcAdapter
objet.
// Vérifier si NFC est activé sur le périphérique si (! NfcAdapter.isEnabled ()) // NFC est désactivé, affichez l'interface utilisateur des paramètres pour l'activer. // Vérifiez si la fonctionnalité Android Beam est activée sur le périphérique sinon (! NfcAdapter. isNdefPushEnabled ()) // Android Beam est désactivé, affiche l'interface utilisateur des paramètres permettant d'activer Android Beam else // NFC et Android Beam sont tous deux activés
Si cette méthode retourne faux
, nous invitons l'utilisateur à l'activer et à afficher l'interface utilisateur des paramètres Android Beam.
startActivity (nouvelle intention (Settings.ACTION_NFCSHARING_SETTINGS));
Si NFC et Android Beam sont activés, nous pouvons procéder au transfert de fichier..
Créer un nouveau Fichier
en utilisant le répertoire où se trouve le fichier sur le périphérique et le nom du fichier. Pour tester le transfert de fichier, j'ai ajouté une image nommée wallpaper.png dans le Des photos répertoire dans le stockage externe.
// Créer un nouveau fichier en utilisant le répertoire et le nom spécifiés File fileToTransfer = new File (fileDirectory, fileName);
Appeler le setBeamPushUris
méthode sur le NfcAdapter
objet et passe l'URI du fichier à transférer.
nfcAdapter.setBeamPushUris (nouvel Uri [] Uri.fromFile (fileToTransfer), this);
le setBeamPushUris
méthode accepte un tableau de Uri
objets. Si vous souhaitez envoyer plusieurs fichiers, vous pouvez transmettre plusieurs URI à l'adaptateur..
Les URI transmis à la setBeamPushUris
méthode sont mis en file d'attente par l'adaptateur et sont transférés au périphérique de réception dès qu'il se trouve à proximité du périphérique d'envoi.
Dans ce tutoriel, vous avez appris les bases de la technologie NFC sur Android. Vous avez également appris à limiter l'accès à une application pour les périphériques non pris en charge à l'aide du fichier manifeste et à déterminer les fonctionnalités du périphérique au moment de l'exécution. Pour envoyer des fichiers via NFC, nous avons utilisé le NfcAdapter
classe.
Bien que j'ai essayé de couvrir les bases du travail avec l'API de transfert de fichiers d'Android Beam pour vous aider à démarrer, il reste encore beaucoup à explorer. Si vous souhaitez en savoir plus, je vous encourage à visiter le portail des développeurs Android pour plus d'informations..