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.
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:
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.
La función de intercambio de datos de Android Beam tiene dos API, la Transferencia NDEF API y el transferencia de archivos API.
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.
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:
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.
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.
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).
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..
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.
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);
Antes de profundizar en el código, veamos qué pasos debemos seguir para transferir un archivo de un dispositivo a otro.
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.
Habilitar NFC y Android Beam en el remitente prensa F11 para depurar la aplicación. Esto instalará y lanzará NFCDemo en el remitente.
Habilitar NFC en el segundo dispositivo, el receptor.
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..
El receptor debe mostrar una notificación en la barra de estado para indicar el progreso de la transferencia de archivos..
Si la transferencia de archivos se completa con éxito, un Haz completo mensaje se muestra al usuario.
Echemos un vistazo al código que hace posible todo esto..
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.
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..
Llama a hasSystemFeature
método en el Gerente de empaquetación
objeto para determinar si el dispositivo tiene soporte NFC. Este método devuelve cierto
Si 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.
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.
Una vez que hayamos determinado que el dispositivo tiene las capacidades requeridas, podemos iniciar la transferencia de archivos usando Android Beam.
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.
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 cierto
Si 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));
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.
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);
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..
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..