Проблема
Проблема в том, что вы переопределяете только метод onBatchScanResults
, а не onScanResult
.onBatchScanResults
сработает только в том случае, если:
- Вы установили режим
ScanSettings
на ScanSettings.SCAN_MODE_LOW_POWER
(это значение по умолчанию), используя ScanSettings.Builder
. - .установите время задержки отчета на некоторое значение> 0, используя
setReportDelay(long reportDelayMillis)
в вашем ScanSettings.Builder
.
reportDelayMillis - Задержка отчета вмиллисекунды.Установите 0, чтобы получать уведомления о результатах немедленно.При значениях> 0 результаты сканирования ставятся в очередь и доставляются после запрошенной задержки или после заполнения внутренних буферов.
Например:
public void startScan(BluetoothLeScanner scanner) {
ScanFilter filter = new ScanFilter.Builder().setDeviceName(null).build();
ArrayList<ScanFilter> filters = new ArrayList<ScanFilter>();
filters.add(filter);
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
.setReportDelay(1l)
.build();
Log.i(TAG,"The setting are "+settings.getReportDelayMillis());
scanner.startScan(filters,settings,BLEScan);
}
Решение
Однако вы, вероятно, просто хотите получать результаты по одному за раз, а не партию результатов.Для этого вам не нужно изменять ScanSettings, вам просто нужно переопределить метод onScanResult
в вашем ScanCallback
, и это поможет.
private ScanCallback mScanCallback =
new ScanCallback() {
public void onScanResult(int callbackType, ScanResult result) {
System.out.println(result.getDevice().getName())
// Do whatever you want
};
...
};
Альтернатива - RxAndroidBle
В любом случае, я настоятельно рекомендую использовать библиотеку RxAndroidBle .Он очень хорошо поддерживается и решает многие проблемы BLE из коробки (сканирование, возможно, является менее сложной частью в BLE).
Используя эту библиотеку, сканирование можно выполнить следующим образом:
Disposable scanSubscription = rxBleClient.scanBleDevices(
new ScanSettings.Builder()
// .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // change if needed
// .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // change if needed
.build()
// add filters if needed
)
.subscribe(
scanResult -> {
// Process scan result here.
},
throwable -> {
// Handle an error here.
}
);
// When done, just dispose.
scanSubscription.dispose();