Está en la página 1de 4

Bluetooth

La mayora de los dispositivos Android tienen Bluetooth y el framework Android ofrece APIs que sirven
para facilitar el uso del Bluetooth en sus aplicaciones. Puede utilizar esta API para intercambiar datos,
conectarse a otros dispositivos que soportan esta tecnologa, etc.

La API Bluetooth le permite:

Activar el Bluetooth si lo necesita.

Escanear y asociar los dispositivos entre ellos.

Transferir los datos.

El primer paso necesario e importante en el uso de las APIs Bluetooth consiste en comprobar si el
dispositivo en cuestin efectivamente tiene Bluetooth.

La clase BluetoothAdapter le permite saber rpidamente si un dispositivo dispone o no de la


tecnologa Bluetooth. Esto es as gracias al mtodo getDefaultAdapter.

BluetoothAdapter bluetoothAdapter =
BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter != null) {
Toast.makeText(this, "Este dispositivo tiene
Bluetooth", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Este dispositivo no tiene
Bluetooth", Toast.LENGTH_LONG).show();
}

La inicializacin del BluetoothAdapter puede devolver dos valores:

null, si el dispositivo no dispone de la tecnologa Bluetooth.

En caso contrario, una instancia de la tecnologa Bluetooth.

No olvide aadir la permission que permite acceder a las APIs Bluetooth.

<uses-permission android:name="android.permission.BLUETOOTH"/>

1. Activar el Bluetooth
El Bluetooth puede estar disponible en el dispositivo pero inactivo. Puede activarlo de dos formas:

Solicitar al usuario si desea activar el Bluetooth.

Activar directamente el Bluetooth.

El primer mtodo es el recomendado, ya que solicita al usuario su autorizacin antes de activarlo.


Para ello, basta con llamar al mtodo startActivityForResult pasando como parmetro
el IntentBluetoothAdapter.ACTION_REQUEST_ENABLE.

if(!bluetoothAdapter.isEnabled()) {
startActivityForResult(new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE),
BLUETOOTH_ACTIVATION);
}

No olvide comprobar si el Bluetooth est activado mediante el mtodo isEnabled.

Lo que dar:
El usuario tendr la eleccin de activar o no el Bluetooth y el resultado de esta decisin se podr
obtener en el mtodo onActivityResult.

@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == BLUETOOTH_ACTIVATION) {
if (resultCode == RESULT_OK) {
Toast.makeText(BluetoothActivity.this,
"El usuario ha activado el Bluetooth",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(BluetoothActivity.this,
"El usuario no ha activado el Bluetooth",
Toast.LENGTH_LONG).show();
}
}
}

Tambin puede forzar la activacin del Bluetooth con el mtodo enable.

bluetoothAdapter.enable();

Esta tcnica fuerza la activacin del Bluetooth sin solicitar la autorizacin del usuario y requiere
otrapermission (la que sirve para administrar el Bluetooth del dispositivo).

<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"/>

2. Permitir a otros dispositivos conectarse


Una aplicacin puede hacer que el dispositivo sea detectable y, de este modo, permitir a otros
dispositivos conectarse al mismo.

Para ello, debe utilizar el mtodo startActivityForResult con un Intent cuyo


valor seaACTION_REQUEST_DISCOVERABLE.

startActivityForResult(new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE), BLUETOOTH_SCAN);

Podr recuperar el resultado en el mtodo onActivityResult.

Lo que dar:
Puede conocer la lista de dispositivos ya asociados al dispositivo en cuestin a travs
del mtodogetBondedDevices. A continuacin, puede recorrer fcilmente la lista de dispositivos que
se han encontrado.

Set<BluetoothDevice> knownDevices =
bluetoothAdapter.getBondedDevices();
for (BluetoothDevice device: knownDevices) {
Log.v("BluetoothActivity", "dispositivo = " + device.getName());
}

La bsqueda de nuevos dispositivos es un tratamiento asncrono y se realiza mediante Broadcast


Receivers. Puede suscribirse a dos Broadcast Receivers, el que gestiona el inicio del proceso de
bsqueda de dispositivos y el invocado cuando la bsqueda ha finalizado.

private BroadcastReceiver discoverDevicesStarted = new


BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_DISCOVER_START)) {
//Comienzo de la bsqueda de nuevos dispositivos
} else if (intent.getAction().equals(ACTION_DISCOVER_END)) {
//Final de la bsqueda de nuevos dispositivos
}
};
};

Debe registrar los Broadcast Receivers en el mtodo onResume de su actividad. No olvide cancelar la
suscripcin en el mtodo onPause.

registerReceiver(discoverDevicesStarted, new
IntentFilter(ACTION_DISCOVER_START));
registerReceiver(discoverDevicesStarted, new
IntentFilter(ACTION_DISCOVER_END));

Para iniciar la bsqueda de nuevos dispositivos, utilice el mtodo startDiscovery.

bluetoothAdapter.startDiscovery();

El mtodo cancelDiscovery permite anular y detener la bsqueda de nuevos dispositivos.


Lo que dar:

@Override
protected void onResume() {
super.onResume();
registerReceiver(discoverDevicesStarted, new
IntentFilter(ACTION_DISCOVER_START));
registerReceiver(discoverDevicesStarted, new
IntentFilter(ACTION_DISCOVER_END));
bluetoothAdapter.startDiscovery();
}

@Override
protected void onPause() {
super.onPause();
unregisterReceiver(discoverDevicesStarted);
bluetoothAdapter.cancelDiscovery();
}

Ahora, puede obtener la lista de dispositivos encontrados en el Broadcast Receiver y, en concreto,


gracias a la accin ACTION_FOUND. Esta accin se invoca cada vez que se encuentra un nuevo
dispositivo.

private BroadcastReceiver discoverDevicesStarted = new


BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_DISCOVER_START)) {
//Comienzo de la bsqueda de nuevos dispositivos
} else if (intent.getAction().equals(ACTION_DISCOVER_END)) {
//Final de la bsqueda de nuevos dispositivos
} else if
(BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) {
if (intent != null &&
intent.hasExtra(BluetoothDevice.EXTRA_DEVICE)) {
BluetoothDevice newDevice =
intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
}
}
};
};

El comportamiento del Bluetooth, para la conexin y la transferencia de datos, es similar al


comportamiento de un cliente y un servidor usando un socket para conectarse.

Puede utilizar las siguientes dos clases para establecer conexiones:

BluetoothServerSocket: utilizada en un servidor para atender conexiones que vienen de


diferentes clientes.

BluetoothSocket: utilizada por el cliente para establecer una conexin a un servidor.

La transferencia de datos se realiza a travs de InputStream.read y OutputStream.write.