Android Bluetooth подключить устройства

Как получить список всех подключенных устройств Bluetooth для Android независимо от профиля?

Кроме того, я вижу, что вы можете получить все подключенные устройства для определенного профиля через BluetoothManager.getConnectedDevices.

И я думаю, я мог видеть, какие устройства подключены, прослушивая подключения / отключения через ACTION_ACL_CONNECTED/ ACTION_ACL_DISCONNECTED... кажется подверженным ошибкам.

Но мне интересно, есть ли более простой способ получить список всех подключенных устройств Bluetooth.

3 ответа

Чтобы увидеть полный список, это двухэтапная операция:

  1. получить список подключенных устройств
  2. сканировать или обнаруживать все остальные в радиусе действия

Чтобы получить список и выполнить итерацию в настоящее время сопряженных устройств:

Set<BluetoothDevice> pairedDevices = BluetoothAdapter.getDefaultAdapter().getBondedDevices();
if (pairedDevices.size() > 0) {
    for (BluetoothDevice d: pairdDevices) {
        String deviceName = d.getName();
        String macAddress = d.getAddress();
        Log.i(LOGTAG, "paired device: " + deviceName + " at " + macAddress);
        // do what you need/want this these list items
    }
}

Discovery - немного более сложная операция. Для этого вам нужно указать BluetoothAdapter начать сканирование / обнаружение. Когда он находит вещи, он отправляет Intents, которые вам нужно получить с BroadcastReceiver.

Сначала мы настроим приемник:

private void setupBluetoothReceiver()
{
    BroadcastRecevier btReceiver = new BroadcastReciver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            handleBtEvent(context, intent);
        }
    };
    IntentFilter eventFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    // this is not strictly necessary, but you may wish
    //  to know when the discovery cycle is done as well
    eventFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    myContext.registerReceiver(btReceiver, eventFilter);
}

private void handleBtEvent(Context context, Intent intent)
{
    String action = intent.getAction();
    Log.d(LOGTAG, "action received: " + action);

    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        Log.i(LOGTAG, "found device: " + device.getName());
    } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
        Log.d(LOGTAG, "discovery complete");
    }
}

Теперь осталось только сообщить адаптеру Bluetooth о начале сканирования:

BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
// if already scanning ... cancel
if (btAdapter.isDiscovering()) {
    btAdapter.cancelDiscovery();
}

btAdapter.startDiscovery();

Лучший способ получить ваши подключенные устройства, например:

  1. сопряженное устройство

            val btManager = baseContext.getSystemService(BLUETOOTH_SERVICE) as BluetoothManager
    val pairedDevices = btManager.adapter.bondedDevices
    
    if (pairedDevices.size > 0) {
    
        for (device in pairedDevices) {
            val deviceName = device.name
            val macAddress = device.address
            val aliasing = device.alias
    
            Log.i(
                " pairedDevices ",
                "paired device: $deviceName at $macAddress + $aliasing " + isConnected(device)
            )
        }
    }
    
  2. проверьте что подключено или нет.

Чтобы проверить, подключено ли сопряженное устройство или нет, вам необходимо использовать этот метод:

      private fun isConnected(device: BluetoothDevice): Boolean {
    return try {
        val m: Method = device.javaClass.getMethod("isConnected")
        m.invoke(device) as Boolean
    } catch (e: Exception) {
        throw IllegalStateException(e)
    }
}

Ссылка: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java .

Таким образом вы получаете «подключенные» устройства, а не просто сопряженные устройства. Дальнейшее его состояние проверять не нужно.

      val btManager = view.getSystemService(BLUETOOTH_SERVICE) as BluetoothManager
val connectedDevices = btManager.getConnectedDevices(GATT)
Другие вопросы по тегам