Моему приложению необходимо постоянно получать значение RSSI устройства bluetooth для приближения к расстоянию rssi, без подключения. Однако метод обратного вызова BluetoothAdapter
получает RSSI только один раз, когда устройство сканируется.
// Device scan callback
private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
public void run() {
...
}
});
}
};
В качестве решения я создал два объекта Runnable
. Один для запуска, другой - для остановки процесса сканирования. Эти два объекта постоянно нажимают друг на друга, пока я не получу желаемое значение RSSI. После этого мой Handler
удаляет их из очереди сообщений.
private Runnable startScan = new Runnable() {
@Override
public void run() {
bluetoothAdapter.startLeScan(leScanCallback);
scanHandler.postDelayed(stopScan, SCAN_INTERVAL);
}
};
private Runnable stopScan = new Runnable() {
@Override
public void run() {
bluetoothAdapter.stopLeScan(leScanCallback);
scanHandler.postDelayed(startScan, STOP_INTERVAL);
}
};
Кажется, что это работает, но я хочу знать, есть ли более эффективный вариант для этого, не подключаясь.