Compartir archivos con NFC en Android

En este tutorial, aprenderá los conceptos básicos de la comunicación P2P (peer-to-peer) y creará una aplicación para compartir archivos grandes, como imágenes y videos, de un dispositivo a otro usando NFC (comunicación de campo cercano) en Android.

1. Introducción

NFC o Cerca de un campo de comunicación Es un conjunto de tecnologías inalámbricas de corto alcance. Permite el intercambio de datos entre una etiqueta NFC y un dispositivo habilitado para NFC, o entre dispositivos habilitados para NFC dentro de una distancia de no más de 4 cm..

Hay tres modos de operación NFC:

  • Leyendo y escribiendo etiquetas sin contacto: Estas etiquetas son generalmente muy pequeñas y no requieren ninguna batería. Se pueden incrustar en todo tipo de objetos, como carteles de películas, productos, pegatinas, etc..
  • Modo de emulación de tarjeta: Piense tarjetas de crédito inteligentes. Esto permite que un dispositivo Android actúe como una tarjeta inteligente. El beneficio obvio de esto es que su dispositivo puede actuar como una tarjeta y luego actuar como una diferente con solo tocar un botón. Esta es una de las formas en que un dispositivo Android puede reemplazar su billetera. Cualquiera que sea la tarjeta de crédito, el pase de autobús o el boleto que esté utilizando, su dispositivo Android podría suplantar de forma segura, por supuesto, ese elemento. El lector en el otro lado de la transacción piensa que está interactuando con ese elemento, cuando en realidad se trata de un dispositivo Android.
  • Comunicación entre iguales: Cada lado reconoce que está hablando con otro dispositivo y no solo con una etiqueta. El protocolo ha sido desarrollado por Google y permite que dos dispositivos envíen mensajes de ida y vuelta..

La función de intercambio de datos de igual a igual (P2P) se agregó a Android en el nivel de API 14 (Android 4.0, Ice Cream Sandwich) y se llama Android Beam. Permite el intercambio rápido de datos de corto alcance entre dos dispositivos Android habilitados para NFC.

2. Comunicación P2P Con Android Beam

La función de intercambio de datos de Android Beam tiene dos API, la Transferencia NDEF API y el transferencia de archivos API.

API de transferencia NDEF

Esta API se introdujo en el nivel 14 de API (Android 4.0, Ice Cream Sandwich) y permite la transferencia de pequeñas cantidades de datos como URL, contactos, etc. Los datos que se deben transferir deben estar formateados en NDEF (Formato de intercambio de datos NFC) y enviado como un mensaje NDEF.

API de transferencia de archivos

La API de transferencia de archivos se introdujo en el nivel 16 de API (Android 4.1, Jelly Bean) y permite la transferencia de archivos grandes, como imágenes, videos, etc..

Hay algunas advertencias sin embargo. Android Beam solo funciona cuando la aplicación que envía los datos se ejecuta en primer plano y el dispositivo que recibe los datos está desbloqueado.

La API de transferencia de archivos de Android Beam tiene dos requisitos adicionales:

  • Los archivos que deben transferirse deben estar ubicados en un almacenamiento externo.
  • Los archivos que deben transferirse deben ser legibles en todo el mundo.

En este tutorial, utilizaremos la API de transferencia de archivos de Android Beam del SDK de Android para crear una aplicación que permita a los usuarios compartir archivos entre dispositivos.

3. Requisitos

Debido a las limitaciones del emulador, la aplicación debe probarse con dos dispositivos Android habilitados para NFC que ejecutan Android 4.1 o superior.

4. Empezando

Usando Eclipse, cree un nuevo proyecto de aplicación para Android y nómbrelo NFCDemo

Dado que la transferencia de archivos de Android Beam solo está disponible en dispositivos con Android 4.1+, debemos configurar SDK mínimo requerido a API 16: Android 4.1 (Jelly Bean).

5. Configurando el archivo de manifiesto

Para usar NFC en una aplicación de Android, tenemos que declarar el permiso NFC en el archivo de manifiesto como se muestra a continuación.

Además, para leer archivos de almacenamiento externo, declare la READ_EXTERNAL_STORAGE permiso como se muestra abajo.

 

No todos los dispositivos Android son compatibles con NFC. Para asegurarse de que nuestra aplicación solo se muestre en Google Play para aquellos dispositivos compatibles con NFC, agregue la  elemento al archivo manifiesto.

Si NFC es una característica opcional de su aplicación, puede omitir la Elemento del archivo de manifiesto y establezca la versión mínima de SDK a un nivel de API más bajo. En ese caso, debe comprobar si el dispositivo es compatible con NFC y la API de Android Beam y actualizar la interfaz de usuario en consecuencia..

6. Creando Diseños

Abre el activity_main.xml archivo de diseño y añadir una Botón Como se muestra abajo. Como puedes ver, hemos añadido un Botón que el usuario puede tocar para iniciar la transferencia de un archivo.

 

7. Implementando la transferencia de archivos

Abre el Actividad principal Clase y reemplace la implementación actual con la que se muestra a continuación. No te preocupes por la implementación por ahora. Te explicaré cada paso en un momento..

paquete com.tutsplus.nfcdemo; import java.io.File; importar android.app.Activity; import android.content.Intent; importar android.content.pm.PackageManager; importar android.net.Uri; importar android.nfc.NfcAdapter; import android.os.Build; importar android.os.Bundle; import android.os.Environment; importar android.provider.Settings; importar android.view.View; importar android.widget.Toast; La clase pública MainActivity extiende la actividad private NfcAdapter nfcAdapter; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); PackageManager pm = this.getPackageManager (); // Compruebe si NFC está disponible en el dispositivo si (! Pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC no está disponible en el dispositivo. Toast.makeText (esto, "El dispositivo no tiene hardware NFC.", Toast.LENGTH_SHORT) .show ();  // Comprueba si el dispositivo está ejecutando Android 4.1 o superior, si (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. Probando la aplicación

Antes de profundizar en el código, veamos qué pasos debemos seguir para transferir un archivo de un dispositivo a otro.

Paso 1

Conecte uno de los dos dispositivos Android a su estación de trabajo de desarrollo a través de USB con Depuración USB habilitado. Vamos a referirnos a ese dispositivo como el remitente.

Paso 2

Habilitar NFC y Android Beam en el remitente prensa F11 para depurar la aplicación. Esto instalará y lanzará NFCDemo en el remitente.

Paso 3

Habilitar NFC en el segundo dispositivo, el receptor.

Etapa 4

Toque en el Enviar archivo abotone y coloque los dispositivos cerca para que NFC haga su trabajo. Deberías ver un Toque para transmitir mensaje aparece en el remitente. Toque la pantalla para iniciar la transferencia..

Paso 5

El receptor debe mostrar una notificación en la barra de estado para indicar el progreso de la transferencia de archivos..

 

Paso 6

Si la transferencia de archivos se completa con éxito, un Haz completo mensaje se muestra al usuario.

9. Decodificando el Código

Echemos un vistazo al código que hace posible todo esto..

Determinar las capacidades del dispositivo

Como se mencionó anteriormente, si NFC es una característica opcional de nuestra aplicación, deberíamos verificar la compatibilidad con NFC y Android Beam. Esta verificación se puede realizar en cualquier lugar en nuestra aplicación. En este ejemplo, he puesto el código en el onCreate método de la Actividad principal clase.

Paso 1

Obtener una referencia a la Gerente de empaquetación.

PackageManager pm = this.getPackageManager ();

los Gerente de empaquetación La clase contiene información sobre todos los paquetes instalados en el dispositivo..

Paso 2

Llama a hasSystemFeature método en el Gerente de empaquetación objeto para determinar si el dispositivo tiene soporte NFC. Este método devuelve ciertoSi el dispositivo admite la función deseada..

if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC no está disponible en el dispositivo.  else // NFC está disponible en el dispositivo. 

Paso 3

Si el dispositivo es compatible con NFC, entonces tenemos que verificar la versión de Android del dispositivo. La versión de Android (nivel de API) que se ejecuta en un dispositivo está disponible a través de  android.os.Build.VERSION.SDK_INT. Si la versión es mayor o igual a 16, Build.VERSION_CODES.JELLY_BEAN, entonces el dispositivo es compatible con la transferencia de archivos de Android Beam.

if (! pm.hasSystemFeature (PackageManager.FEATURE_NFC)) // NFC no está disponible en el dispositivo.  // Comprueba si el dispositivo está ejecutando Android 4.1 o superior, si (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)  // Android Beam feature is not supported.  else  // NFC and Android Beam file transfer is supported. 

Iniciar transferencia de archivos

Una vez que hayamos determinado que el dispositivo tiene las capacidades requeridas, podemos iniciar la transferencia de archivos usando Android Beam.

Paso 1

Obtener una referencia a la Adaptador nfc.

nfcAdapter = NfcAdapter.getDefaultAdapter (esto); 

El trabajo de la Adaptador nfc es administrar el intercambio de datos entre una etiqueta NFC y un dispositivo habilitado para NFC o entre dos dispositivos habilitados para NFC.

Paso 2

El adaptador puede ser habilitado o deshabilitado. Para determinar si el adaptador está habilitado, llame al está habilitado método en el Adaptador nfc objeto.

// Compruebe si NFC está habilitado en el dispositivo si (! NfcAdapter.isEnabled ()) // NFC está deshabilitado, muestre la interfaz de usuario de configuración para habilitar NFC else // NFC está habilitado

Este método devuelve ciertoSi NFC está habilitado en el dispositivo. Si NFC está deshabilitado, le pedimos al usuario que lo habilite y que muestre la interfaz de usuario de la configuración de NFC. 

startActivity (nueva Intención (Settings.ACTION_NFC_SETTINGS));

Paso 3

Del mismo modo, la función Android Beam también se puede habilitar o deshabilitar. Para verificar su estado, llame al isNdefPushEnabled método en el Adaptador nfc objeto.

// Compruebe si NFC está habilitado en el dispositivo si (! NfcAdapter.isEnabled ()) // NFC está deshabilitado, muestre la IU de configuración para habilitar NFC // Compruebe si la función Android Beam está habilitada en el dispositivo else if (! NfcAdapter. isNdefPushEnabled ()) // Android Beam está deshabilitado, muestra la IU de configuración para habilitar Android Beam else // NFC y Android Beam están habilitados

Si este método vuelve falso, solicitamos al usuario que lo habilite y muestre la configuración de usuario de la interfaz de usuario de Android Beam.

startActivity (nueva Intención (Settings.ACTION_NFCSHARING_SETTINGS));

Si tanto NFC como Android Beam están habilitados, podemos continuar con la transferencia de archivos.

Etapa 4

Crear un nuevo Expediente usando el directorio donde se encuentra el archivo en el dispositivo y el nombre del archivo. Para probar la transferencia de archivos, he añadido una imagen llamada wallpaper.png en el Imágenes directorio en el almacenamiento externo.

// Crear un nuevo archivo utilizando el directorio y el nombre especificados File fileToTransfer = new File (fileDirectory, fileName);

Paso 5

Llama a setBeamPushUris método en el Adaptador nfc Objeto y pasar el URI del archivo a transferir..

nfcAdapter.setBeamPushUris (new Uri [] Uri.fromFile (fileToTransfer), esto);

los setBeamPushUris método acepta una matriz de Uri objetos. Si desea enviar más de un archivo, puede pasar varios URI al adaptador.

Los URI pasaron a la setBeamPushUris El adaptador encola los métodos y los transfiere al dispositivo receptor tan pronto como se acerca al dispositivo emisor..

Conclusión

En este tutorial, aprendiste sobre los conceptos básicos de NFC en Android. También aprendió cómo restringir el acceso a una aplicación mediante dispositivos no compatibles mediante el archivo de manifiesto y determinar las capacidades del dispositivo en tiempo de ejecución. Para enviar archivos usando NFC, hicimos uso de la Adaptador nfc clase.

Si bien he tratado de cubrir los aspectos básicos del trabajo con la API de transferencia de archivos de Android Beam para ayudarlo a comenzar, aún hay más información. Si desea obtener más información, lo invito a visitar el portal de desarrolladores de Android para obtener más información..