Я понял, как заставить это работать ... вроде. Проблема в том, что мой фильтр был на serviceUuid
, который, как я полагаю, просматривает периферийные устройства, которые рекламируют UUID в коллекции advertisedServices
. Моя периферия объявляет UUID только как ключ в своем ассоциативном массиве serviceData
, поэтому я переключился на фильтр serviceData
следующим образом, и теперь я могу найти свое периферийное устройство:
AsyncTask.execute {
val scanFilters = Settings.scannedBleServices.values.map {
ScanFilter.Builder().setServiceData(it, null).build()
}
val scanSettingsBuilder = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setReportDelay(0L)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
scanSettingsBuilder
.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
.setNumOfMatches(ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT)
}
bluetoothAdapter?.bluetoothLeScanner?.startScan(
scanFilters,
scanSettingsBuilder.build(),
leScanCallback
)
}
Проблема в том, чтотеперь фильтр слишком разрешительный, так как я получаю обратный вызов для всех периферийных устройств, даже без каких-либо serviceData
, как если бы я вообще не указал фильтр. Может быть, это потому, что я передал null
в качестве второго параметра setServiceData
в фильтре, потому что я не знал, что еще добавить туда. И документация не совсем полезна.
Я предполагаю, что этого достаточно для сканирования в фоновом режиме (я еще не пробовал), но это будет иметь больше смысла, еслиЯ мог бы ограничить количество вызовов обратного вызова, и мне не нужно было фильтровать самому.