Есть ли способ получить список подключенных устройств из профилей поддержки (HDD, Spp и аудио). Требование состоит в том, что мое устройство будет поддерживать HDD, SPP и аудио, поэтому я должен отфильтровать устройства, которые поддерживают все эти профили. Можно ли как-то фильтровать устройства?
Как получить список подключенных устройств из определенного профиля Bluetooth
Ответы (1)
Да, это возможно, но ваше приложение для Android должно быть ориентировано на SDK 11 или более позднюю версию (Android 3.0.X).
Решение вашего вопроса заключается в том, что вам нужно запросить все BluetoothDevices, известные вашему устройству Android. Под известными я подразумеваю все сопряженные подключенные или неподключенные устройства, а также несопряженные подключенные устройства.
Мы отфильтруем неподключенные устройства позже, так как вам нужны только подключенные устройства.
- Сначала вам нужно получить
BluetoothAdapter
:
окончательный BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
- Во-вторых, вам нужно убедиться, что Bluetooth доступен и включен:
if (btAdapter != null && btAdapter.isEnabled()) // null означает отсутствие Bluetooth!
Если Bluetooth не отключен, вы можете либо использовать btAdapter.enable()
, что не рекомендуется в документации, либо попросить пользователя сделать это: Программное включение Bluetooth на Android
- В-третьих, вам нужно определить массив состояний (чтобы отфильтровать неподключенные устройства):
окончательные состояния int [] = new int [] {BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING};
В-четвертых, вы создаете
BluetoothProfile.ServiceListener
, который содержит два обратных вызова, запускаемых при подключении и отключении службы:final BluetoothProfile.ServiceListener listener = new BluetoothProfile.ServiceListener() { @Override public void onServiceConnected(int profile, BluetoothProfile proxy) { } @Override public void onServiceDisconnected(int profile) { } };
Теперь, поскольку вам нужно повторить процесс запроса для всех доступных профилей Bluetooth в Android SDK (A2Dp, GATT, GATT_SERVER, Handset, Health, SAP), вы должны действовать следующим образом:
В onServiceConnected
поместите условие, которое проверяет текущий профиль, чтобы мы добавили найденные устройства в правильную коллекцию, и мы используем: proxy.getDevicesMatchingConnectionStates(states)
для фильтрации неподключенных устройств:
switch (profile) {
case BluetoothProfile.A2DP:
ad2dpDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.GATT: // NOTE ! Requires SDK 18 !
gattDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.GATT_SERVER: // NOTE ! Requires SDK 18 !
gattServerDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.HEADSET:
headsetDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.HEALTH: // NOTE ! Requires SDK 14 !
healthDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
case BluetoothProfile.SAP: // NOTE ! Requires SDK 23 !
sapDevices.addAll(proxy.getDevicesMatchingConnectionStates(states));
break;
}
И, наконец, последнее, что нужно сделать, это запустить процесс запроса:
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.A2DP);
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.GATT); // NOTE ! Requires SDK 18 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.GATT_SERVER); // NOTE ! Requires SDK 18 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.HEADSET);
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.HEALTH); // NOTE ! Requires SDK 14 !
btAdapter.getProfileProxy(yourContext, listener, BluetoothProfile.SAP); // NOTE ! Requires SDK 23 !
BluetoothAdapter.getBondedDevices()
(примечание: Bluetooth должен быть включен, чтобы этот вызов работал). Для непарных подключенных устройств просто сопоставьте список, полученный с моим кодом выше, и тот, который вы получили с помощью getBondedDevices()
. Для этого проверьте их MacAddresses (BluetoothDevice.getAddress()
). Если устройство найдено в обоих списках, откажитесь от него. Если нет, это означает, что это подключающееся или подключенное устройство не сопряжено. Ну вот! ;-)
- person Mackovich; 18.01.2016