Está en la página 1de 16

Tópicos

Avanzados en
Android
Bluetooth
Contenido
• Introducción
• Contenido
• Tópicos avanzados Android: Bluetooth
• Permisos de Bluetooth
• Configuración de Bluetooth
• Búsqueda de Dispositivos
• Conexión como Servidor
• Conexión como Cliente
• Demostración
Tópicos avanzados Android –Bluetooth
Permisos Para usar las funciones de Bluetooth en tu
aplicación, debes declarar dos permisos. El
<manifest ... >
<uses-permission android:name="android.permission.BLUETOOTH" /> primero es BLUETOOTH. Necesitas este permiso
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" para establecer cualquier comunicación de
/> Bluetooth, como solicitar o aceptar una conexión
<!-- If your app targets Android 9 or lower, you can declare
y transferir datos.
ACCESS_COARSE_LOCATION instead. -->
<uses-permission El otro permiso que debes declarar es
android:name="android.permission.ACCESS_FINE_LOCATION" />
ACCESS_FINE_LOCATION. Tu app necesita
...
</manifest> este permiso porque es posible usar un escaneo de
Bluetooth para reunir información sobre la
ubicación del usuario. Esta información puede
obtenerse desde el dispositivo del usuario o desde
balizas Bluetooth en determinados lugares, como
tiendas y áreas de tránsito.
Tópicos avanzados Android –Bluetooth
Configuración de Bluetooth

Si Bluetooth no es compatible, debes inhabilitar correctamente cualquier función de Bluetooth. En caso de


que Bluetooth sea compatible, pero esté inhabilitado, puedes solicitar que el usuario lo habilite sin
abandonar tu aplicación. Esta configuración se logra en dos pasos, mediante el BluetoothAdapter.
Tópicos avanzados Android –Bluetooth
Configuración de Bluetooth

Para configurar es necesario verificar la compatibilidad del


dispositivo. Si Bluetooth no es compatible, debes inhabilitar
BluetoothAdapter bluetoothAdapter = correctamente cualquier función de Bluetooth. En caso de
que Bluetooth sea compatible, pero esté inhabilitado,
BluetoothAdapter.getDefaultAdapter(); puedes solicitar que el usuario lo habilite sin abandonar tu
if (bluetoothAdapter == null) { aplicación. Esta configuración se logra en dos pasos,
mediante el BluetoothAdapter.
// Device doesn't support Bluetooth • Paso 1 – Obtener el Bluetooth Adapter: para hacerlo se
llamada directamente al método estático
} getDefaultAdapter(). Si al realizar el llamado el método
retorna null, significa que el dispositivo no es
compatible.
Tópicos avanzados Android –Bluetooth
Configuración de Bluetooth
Tópicos avanzados Android –Bluetooth
Configuración de Bluetooth
if (!bluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
• REQUEST_ENABLE_BT. Es una constante que se define localmente. Su valor es mayor que 0.
El sistema te devuelve este valor en tu implementación onActivityResult() como parámetro requestCode.
• RESULT_OK. Constante devuelta por la función cuando se realiza con éxito la configuración.
• RESULT_CANCELED. Constante devuelta por la función en caso de que se genere un error
durante la configuración.
Tópicos avanzados Android - Buscar
Dispositivos
BluetoothAdapter
• Permite buscar dispositivos Bluetooth remotos mediante la detección de dispositivos o la
consulta de la lista de dispositivos sincronizados.
Detección de dispositivos
• Procedimiento de escaneo que busca en el área local dispositivos con Bluetooth
habilitado y, luego, solicita información sobre cada uno de ellos.
Solicitud de vinculación
• Una vez que se establezca una conexión con un dispositivo remoto por primera vez, esta
se presentará automáticamente al usuario y guarda el nombre, la clase y la dirección MAC
para luego ser leído por la API de Bluetooth.
Tópicos avanzados Android - Buscar
dispositivos vinculados

• Es importante consultar previamente el conjunto de dispositivos sincronizados


a fin de ver si el dispositivo deseado ya es conocido.

• Para inicializar una conexión con un dispositivo Bluetooth, solo se necesita la


dirección MAC del objeto BluetoothDevice asociado, que se puede recuperar
llamando a getAddress().
Encontrar dispositivos nuevos mediante
detección de dispositivos
• Para comenzar a detectar dispositivos se debe llamar a startDiscovery(). El proceso es
asíncrono y devuelve un valor booleano que indica si se inició correctamente la
detección.

• A fin de recibir información sobre cada dispositivo detectado, la aplicación debe


registrar un BroadcastReceiver para la intent ACTION_FOUND. La intent contiene los
campos adicionales EXTRA_DEVICE y EXTRA_CLASS, que, a su vez, contienen un
BluetoothDevice y una BluetoothClass, respectivamente.

• Para inicializar una conexión con un dispositivo Bluetooth, se necesita la dirección MAC
del objeto BluetoothDevice asociado, que se puede recuperar llamando a getAddress().
Tópicos avanzados Android - Conectar
Dispositivos

Se debe implementar los mecanismos del lado del servidor y del lado del cliente.

El servidor recibe la información del socket cuando se acepta una conexión entrante. El cliente
proporciona la información del socket cuando abre un canal RFCOMM hacia el servidor.

El servidor y el cliente se consideran conectados entre sí cuando tienen un BluetoothSocket


conectado en el mismo canal RFCOMM. Cada dispositivo puede obtener flujos de entrada y salida,
y se puede iniciar la transferencia de datos.
Tópicos avanzados Android - Conexión como
Servidor
• Cuando se desea conectar dos dispositivos, uno deberá funcionar como
servidor y tener un BluetoothServerSocket abierto.

• El propósito del socket de servidor es recibir solicitudes de conexiones


entrantes y proporcionar un BluetoothSocket conectado cuando se acepta una.

• Cuando el BluetoothSocket se obtiene del BluetoothServerSocket, el


BluetoothServerSocket puede (y debería) descartarse, a menos que se quiera
que el dispositivo acepte más conexiones.
Pasos para Configurar un Socket de Servidor y
Aceptar una Conexión
1. Obtener un BluetoothServerSocket • El identificador único universal (UUID) también se incluye en
llamando a la entrada del SDP y conforma la base del acuerdo de
listenUsingRfcommWithServiceRecor conexión con el dispositivo del cliente.
d()

• Una conexión se acepta solo cuando un dispositivo remoto


2. Llamar a accept() para comenzar a envía una solicitud de conexión que contiene un UUID que
recibir solicitudes de conexión coincide con el UUID registrado con este socket de servidor
de recepción.

3. Opcionalmente se pueden aceptar


conexiones adicionales llamando a • Libera el socket de servidor y todos sus recursos, pero no
cierra el BluetoothSocket conectado que accept() devuelve.
close()
Tópicos avanzados Android - Conexióncomo
Cliente

Para inicializar una conexión con el dispositivo remoto que acepta conexiones en un
socket de servidor abierto, primero debes obtener un objeto BluetoothDevice que
represente al dispositivo remoto. Para obtener información sobre cómo crear un
BluetoothDevice, consulta Cómo buscar dispositivos. Luego, debes usar el
BluetoothDevice para obtener un BluetoothSocket e inicializar la conexión.
Procedimiento para la Conexión como Cliente
Usando el BluetoothDevice, obtén un BluetoothSocket llamando
a createRfcommSocketToServiceRecord(UUID).
• Este método inicializa un objeto BluetoothSocket que le permite al cliente conectarse con un
BluetoothDevice. El UUID que se pasa aquí debe coincidir con el UUID empleado por el dispositivo del
servidor cuando hizo la llamada a listenUsingRfcommWithServiceRecord(String, UUID) para abrir su
BluetoothServerSocket. Para usar un UUID que coincida, codifica la cadena del UUID en tu aplicación y,
luego, haz referencia a ella en el código del servidor y el cliente.

Llama a connect() para inicializar la conexión. Ten presente que este método es una llamada de
bloqueo.
• Después de que el cliente llama a este método, el sistema realiza una búsqueda de SDP para encontrar un
dispositivo remoto que tenga el mismo UUID. Si la búsqueda es correcta y el dispositivo remoto acepta la
conexión, este último comparte el canal RFCOMM que se usará durante la conexión, y se devuelve el
método connect(). Si la conexión no funciona o si se agota el tiempo de espera del método connect(),
dicho método devuelve una IOException.
• Debido a que connect() es una llamada de bloqueo, siempre debes realizar este procedimiento de
conexión en un subproceso diferente del subproceso de la IU de la actividad principal.
Demostración

También podría gustarte