Я использую LeScanCallback (не могу использовать более новые методы сканирования, потому что я разрабатываю для api 18. Не то чтобы это важно, так как apis 5.0 + apis также не предлагает эту функцию), чтобы обнаружить, когда соседнее устройство BLE:
private BluetoothAdapter.LeScanCallback bleCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice bluetoothDevice, int i, byte[] bytes) {
discoveredDevices.add(bluetoothDevice);
}
};
Я не подключаюсь и не подключаюсь к устройствам, потому что это не требуется, я просто хочу посмотреть, какие устройства находятся поблизости.
Я пытаюсь сделать службу, которая каждые 5 минут вызывает веб-сервер, чтобы обновлять, какие устройства находятся поблизости в этот момент.
Трудная часть заключается в том, что устройство Android будет двигаться, поэтому устройство Bluetooth, находящееся поблизости прямо сейчас, может не быть в течение 5 минут. В этом случае мне нужно удалить его из discoveredDevices
.
В идеале, я хотел бы получить обратный вызов, когда устройство Bluetooth находилось в диапазоне раньше, но больше не существует. Этот обратный вызов не существует, хотя.
(Я знаю трансляции android.bluetooth.device.action.ACL_CONNECTED
и android.bluetooth.device.action.ACL_DISCONNECTED
, но это касается того, когда вы подключаетесь к Bluetooth-устройству, чего я не хочу.)
Опция состоит в том, чтобы делать новое сканирование каждые 5 минут, но вы не можете сказать, когда все обнаруженные поблизости устройства были обнаружены, поэтому вам нужно будет выполнить временное сканирование, например. сканировать в течение 5 секунд, а затем отправить собранные данные в веб-службу.
Это звучит грязно и рискованно, потому что вы не можете точно знать, что все находящиеся поблизости устройства были обнаружены в течение отведенного времени, поэтому я очень хотел бы избежать этого.
Есть ли другой способ сделать это?
Edit
Некоторые устройства постоянно сообщают об обнаружении близлежащих устройств Bluetooth, даже если они уже были обнаружены ранее. Если бы эта функциональность была универсальной, я мог бы решить мою проблему, однако это специфично для устройства.
Мой адаптер Bluetooth для телефона, например, только один раз обнаруживает соседние устройства. Некоторые другие устройства, с которыми я тестировал, постоянно сообщают о тех же ближайших устройствах, но не все устройства, поэтому я не могу полагаться на это, к сожалению.