Cómo buscar dispositivos Bluetooth

Con BluetoothAdapter, puedes encontrar dispositivos Bluetooth remotos mediante la detección de dispositivos consultar la lista de dispositivos vinculados.

Asegúrate de tener los permisos de Bluetooth adecuados. y configura tu app para usar Bluetooth antes de intentar encontrar dispositivos Bluetooth.

La detección de dispositivos es un procedimiento de búsqueda que busca en el área local Dispositivos con Bluetooth habilitado y solicita información sobre cada uno. Esta a veces se conoce como descubrir, indagar o escanear. Un dispositivo Bluetooth cercano responde a una solicitud de detección solo si acepta actualmente solicitudes de información al ser detectable. Si un dispositivo es detectable, responde a la solicitud de descubrimiento compartiendo información, como el nombre del dispositivo, su clase y su dirección MAC única. Uso información, el dispositivo que lleva a cabo la detección puede elegir para iniciar una conexión con el dispositivo detectado.

Debido a que los dispositivos detectables pueden revelar información sobre la ubicación del usuario, el proceso de detección de dispositivos requiere acceso a la ubicación. Si tu app está en uso en un dispositivo con Android 8.0 (nivel de API 26) o una versión posterior, considera usar la Administrador de dispositivo complementario API en su lugar. Esta API detecta dispositivos en nombre de tu app para que esta no tenga que solicitar permisos de ubicación

Una vez que se establezca una conexión con un dispositivo remoto por primera vez, aparecerá una ventana de se presenta automáticamente al usuario. Cuando un dispositivo está vinculado, el información básica sobre el dispositivo, como el nombre, la clase y el MAC dirección de correo electrónico) se guarda y se puede leer mediante las APIs de Bluetooth. Usa el MAC conocido de un dispositivo remoto, se puede iniciar una conexión con este en cualquier momento sin llevar a cabo la detección, asumiendo que el dispositivo sigue dentro del alcance.

Ten presente que existe una diferencia entre la vinculación y la conexión:

  • Estar vinculados significa que dos dispositivos conocen la existencia del otro. tienen una clave de vínculo compartida que se puede usar para la autenticación y pueden estableciendo una conexión cifrada entre sí.
  • Estar conectados significa que los dispositivos actualmente comparten un canal RFCOMM y pueden transmitir datos entre sí. El Bluetooth actual Las APIs requieren que los dispositivos se vinculen antes de que se pueda realizar una conexión RFCOMM establecidos. La vinculación se realiza automáticamente cuando inicias una solicitud con las APIs de Bluetooth.

En las siguientes secciones, se describe cómo encontrar dispositivos que se vincularon cómo descubrir dispositivos nuevos usando la detección de dispositivos.

Realizar consultas a dispositivos sincronizados

Antes de llevar a cabo la detección de dispositivos, vale la pena consultar el conjunto de para ver si el dispositivo deseado ya es conocido. Para ello, llama a getBondedDevices(). Esto devuelve un conjunto de Objetos BluetoothDevice que representan dispositivos vinculados. Por ejemplo, puedes consultar todos los dispositivos vinculados y obtener el nombre y la dirección MAC de cada dispositivo, como en el siguiente fragmento de código demuestra lo siguiente:

Kotlin

val pairedDevices: Set<BluetoothDevice>? = bluetoothAdapter?.bondedDevices
pairedDevices?.forEach { device ->
   val deviceName = device.name
   val deviceHardwareAddress = device.address // MAC address
}

Java

Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {
   // There are paired devices. Get the name and address of each paired device.
   for (BluetoothDevice device : pairedDevices) {
       String deviceName = device.getName();
       String deviceHardwareAddress = device.getAddress(); // MAC address
   }
}

Para iniciar una conexión con un dispositivo Bluetooth, solo necesitas el objeto BluetoothDevice asociado es la dirección MAC, que recuperas llamando getAddress() Tú puedes obtener más información sobre cómo crear una conexión en Conectar Bluetooth dispositivos.

Detectar dispositivos

Para comenzar a detectar dispositivos, llama startDiscovery() El proceso es asíncrono y devuelve un valor booleano que indica si el descubrimiento se inició correctamente. El proceso de descubrimiento suele implicar de consulta de aproximadamente 12 segundos, seguido de un escaneo de página de cada dispositivo encontrado para recuperar su nombre de Bluetooth.

Para recibir información sobre cada dispositivo descubierto, la app debe registrar un BroadcastReceiver para el ACTION_FOUND . El sistema emite esta intent para cada dispositivo. El intent contiene los campos adicionales EXTRA_DEVICE y EXTRA_CLASS, que a su vez, contienen una BluetoothDevice y una BluetoothClass, respectivamente. En el siguiente fragmento de código, se muestra cómo puedes registrarte para controlar la transmisión Cuando se descubren los dispositivos:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
   ...

   // Register for broadcasts when a device is discovered.
   val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
   registerReceiver(receiver, filter)
}

// Create a BroadcastReceiver for ACTION_FOUND.
private val receiver = object : BroadcastReceiver() {

   override fun onReceive(context: Context, intent: Intent) {
       val action: String = intent.action
       when(action) {
           BluetoothDevice.ACTION_FOUND -> {
               // Discovery has found a device. Get the BluetoothDevice
               // object and its info from the Intent.
               val device: BluetoothDevice =
                       intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
               val deviceName = device.name
               val deviceHardwareAddress = device.address // MAC address
           }
       }
   }
}

override fun onDestroy() {
   super.onDestroy()
   ...

   // Don't forget to unregister the ACTION_FOUND receiver.
   unregisterReceiver(receiver)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
   ...

   // Register for broadcasts when a device is discovered.
   IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
   registerReceiver(receiver, filter);
}

// Create a BroadcastReceiver for ACTION_FOUND.
private final BroadcastReceiver receiver = new BroadcastReceiver() {
   public void onReceive(Context context, Intent intent) {
       String action = intent.getAction();
       if (BluetoothDevice.ACTION_FOUND.equals(action)) {
           // Discovery has found a device. Get the BluetoothDevice
           // object and its info from the Intent.
           BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
           String deviceName = device.getName();
           String deviceHardwareAddress = device.getAddress(); // MAC address
       }
   }
};

@Override
protected void onDestroy() {
   super.onDestroy();
   ...

   // Don't forget to unregister the ACTION_FOUND receiver.
   unregisterReceiver(receiver);
}

Para iniciar una conexión con un dispositivo Bluetooth, llama a getAddress() en el BluetoothDevice para recuperar la dirección MAC asociada.

Habilitar la visibilidad

Para que el dispositivo local sea detectable para otros dispositivos, llama startActivityForResult(Intent, int) con el ACTION_REQUEST_DISCOVERABLE . Se emite una solicitud para habilitar el modo detectable del sistema sin tener que navegar a la app de Configuración, lo que detendría tu propia app. De de forma predeterminada, el dispositivo se vuelve detectable durante dos minutos. Puedes definir de duración diferente, hasta una hora, si agregas el EXTRA_DISCOVERABLE_DURATION adicionales.

El siguiente fragmento de código configura el dispositivo para que sea detectable durante cinco minutos:

Kotlin

val requestCode = 1;
val discoverableIntent: Intent = Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE).apply {
   putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300)
}
startActivityForResult(discoverableIntent, requestCode)

Java

int requestCode = 1;
Intent discoverableIntent =
       new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivityForResult(discoverableIntent, requestCode);


Figura 2: Diálogo para habilitar la visibilidad

Se muestra un diálogo en el que se solicita permiso al usuario para fabricar el dispositivo. detectable, como se muestra en la figura 2. Si el usuario responde "Permitir", luego el se hace visible durante el tiempo especificado. Tu actividad después recibe una llamada a la onActivityResult() en la devolución de llamada, cuyo código de resultado será igual a la duración de la carga detectable. Si el usuario respondió "Rechazar" o si se produjo un error, el resultado código es RESULT_CANCELED.

El dispositivo se mantendrá silenciosamente en el modo detectable durante el tiempo asignado. Ser una notificación cuando cambie el modo detectable, registra un BroadcastReceiver para el ACTION_SCAN_MODE_CHANGED . Este intent contiene los campos adicionales EXTRA_SCAN_MODE y EXTRA_PREVIOUS_SCAN_MODE, que proporcionan el modo de análisis nuevo y el antiguo, respectivamente. Valores posibles para cada uno adicionales son los siguientes:

SCAN_MODE_CONNECTABLE_DISCOVERABLE
El dispositivo está en modo detectable.
SCAN_MODE_CONNECTABLE
El dispositivo no está en modo detectable, pero puede recibir conexiones.
SCAN_MODE_NONE
El dispositivo no está en modo detectable y no puede recibir conexiones.

Si inicias la conexión con un dispositivo remoto, no es necesario habilitar la visibilidad del dispositivo. La habilitación de la visibilidad solo es necesaria cuando quieres que tu app aloje un socket de servidor que acepte remotas, ya que los dispositivos remotos deben poder descubrir otros dispositivos antes iniciar conexiones con esos otros dispositivos.