Partage de fichiers avec NFC sur Android

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

1. Introduction

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:

  • Lire et écrire des tags sans contact: Ces étiquettes sont généralement très petites et ne nécessitent aucune alimentation par batterie. Ils peuvent être intégrés à toutes sortes d'objets, tels que des affiches de films, des produits, des autocollants, etc..
  • Mode d'émulation de carte: Pensez aux cartes de crédit intelligentes. Cela permet à un appareil Android de se comporter comme une carte à puce. L'avantage évident de cela est que votre appareil peut agir comme une seule carte et ensuite comme une autre en appuyant simplement sur un bouton. C'est l'une des façons dont un appareil Android peut remplacer votre portefeuille. Quelle que soit la carte de crédit, le ticket de bus ou le ticket que vous utilisez, votre appareil Android peut emprunter l'identité de celui-ci, en toute sécurité. Le lecteur de l'autre côté de la transaction pense qu'il interagit avec cet élément alors qu'en fait, il s'agit d'un appareil Android..
  • Communication d'égal à égal: Chaque partie reconnaît qu’elle parle à un autre appareil et pas seulement à une étiquette. Le protocole a été développé par Google et permet à deux appareils d'envoyer des messages dans les deux sens..

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.

2. Communication P2P avec Android Beam

La fonctionnalité d'échange de données Android Beam comporte deux API, la Transfert NDEF API et le transfert de fichier API.

API de transfert NDEF

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.

API de transfert de fichier

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:

  • Les fichiers à transférer doivent être situés dans un stockage externe..
  • Les fichiers à transférer doivent être lisibles par tout le monde..

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

3. Conditions requises

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

4. Commencer

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

5. Configuration du fichier manifeste

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

6. Créer des mises en page

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.

 

7. Mise en œuvre du transfert de 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);    

8. Test de l'application

Avant de plonger dans le code, voyons les étapes à suivre pour transférer un fichier d'un périphérique à un autre.

Étape 1

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.

Étape 2

Activer NFC et Android Beam sur l'expéditeur. presse F11 déboguer l'application. Cela installera et lancera NFCDemo sur l'expéditeur.

Étape 3

Activer NFC sur le deuxième appareil, le receveur.

Étape 4

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.

Étape 5

Le destinataire doit afficher une notification dans la barre d'état pour indiquer la progression du transfert de fichier..

 

Étape 6

Si le transfert de fichier est terminé avec succès, un Faisceau complet le message est affiché à l'utilisateur.

9. Décoder le code

Jetons un coup d'oeil au code qui rend tout cela possible.

Déterminer les capacités du périphérique

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.

Étape 1

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

Étape 2

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

Étape 3

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. 

Lancer le transfert de fichier

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

Étape 1

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.

Étape 2

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

Étape 3

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

Étape 4

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

Étape 5

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.

Conclusion

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