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.