В своем приложении я реализовал классический Bluetooth согласно официальной документации: https://developer.android.com/guide/topics/connectivity/bluetooth. По умолчанию startDiscovery()
будет сканировать все ближайшие Bluetooth-устройства. Но во многих ситуациях пользователь/разработчик уже знает нужную категорию устройств. В моем случае нужно найти конкретное устройство, реализующее метод:
bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(SERVICE_NAME, MY_UUID_INSECURE);
В идеале нужно реализовать поиск и подключить два устройства в один клик. Как выбрать нужное устройство из списка найденных устройств? Это сделано для удобства использования приложения, чтобы вам не приходилось выбирать из множества ненужных устройств. Это будет своеобразный фильтр как в BLE. Но мы говорим о Bluetooth Classic. Как я могу использовать SERVICE_NAME, MY_UUID_INSECURE, BluetoothClass для выполнения этой задачи?
ИЗМЕНИТЬ:
Я нашел несколько решений этой проблемы. Но все они не идеальны. Я пока просто исключаю из списка устройств те, у которых есть device.getType() == 2
(DEVICE_TYPE_LE).
Вариант 1
Найдите устройство, которое транслирует сервис с таким же UUID, как у меня. Для этого используйте метод fetchUuidsWithSdp()
для найденных устройств. Пример реализации: https://stackoverflow.com/a/37070600
Недостаток этого метода. Время. Вы должны подождать, пока не получите BluetoothAdapter.ACTION_DISCOVERY_FINISHED
, прежде чем звонить fetchUuidsWithSdp()
. Это займет 12-18 секунд. В дополнение к этому необходимо дождаться завершения каждого последующего вызова fetchuuidsWithSdp()
, а затем выполнить вызов этого метода для другого устройства. Это займет около 3 секунд на устройство. В общей сложности поиск нужного устройства может занять очень много времени.
Вариант 2
Измените имя устройства на закрытый ключ или специальное имя, которое клиент может использовать для идентификации устройства.
bluetoothAdapter.setName(name);
Главное не забыть вернуть название устройства к исходному.
saveName = bluetoothAdapter.getName();
Пример реализации: https://stackoverflow.com/a/40138077/4716092
Недостаток этого метода. Изменить имя устройства на самом деле не так просто. Если не вернуть старое имя устройства, пользователь может расстроиться.