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

Есть ли способ получить список подключенных устройств из профилей поддержки (HDD, Spp и аудио). Требование состоит в том, что мое устройство будет поддерживать HDD, SPP и аудио, поэтому я должен отфильтровать устройства, которые поддерживают все эти профили. Можно ли как-то фильтровать устройства?


person Sainath    schedule 13.01.2016    source источник
comment
Будет ли класс bluetoothManager предоставлять параметр фильтра?   -  person Sainath    schedule 14.01.2016


Ответы (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 !
person Mackovich    schedule 14.01.2016
comment
Как получить все сопряженные подключенные или неподключенные устройства и непарные подключенные устройства. - person Sainath; 18.01.2016
comment
Чтобы получить все подключенные/неподключенные сопряженные устройства, просто позвоните BluetoothAdapter.getBondedDevices() (примечание: Bluetooth должен быть включен, чтобы этот вызов работал). Для непарных подключенных устройств просто сопоставьте список, полученный с моим кодом выше, и тот, который вы получили с помощью getBondedDevices(). Для этого проверьте их MacAddresses (BluetoothDevice.getAddress()). Если устройство найдено в обоих списках, откажитесь от него. Если нет, это означает, что это подключающееся или подключенное устройство не сопряжено. Ну вот! ;-) - person Mackovich; 18.01.2016
comment
@Сайнат, добро пожаловать. Если мой ответ помог вам достичь того, что вы искали, примите его, чтобы другие люди в вашей ситуации тоже могли получить ответ. И если ответ достаточно удовлетворительный, не стесняйтесь голосовать ;-) - person Mackovich; 18.01.2016
comment
На самом деле мое требование немного отличается, это похоже на то, что после включения Bluetooth мы получим список устройств, в котором мне нужно фильтровать только определенные устройства. в настоящее время устройства, которые я должен фильтровать, будут поддерживать все три профиля, такие как SPP, AUdio и HID. с этой информацией я должен фильтровать определенные устройства. Если вы можете предоставить дополнительную информацию, это будет очень полезно. Спасибо - person Sainath; 19.01.2016