Как использовать имя устройства в фильтре сканирования ble в Kotlin

#android #kotlin #bluetooth-lowenergy

Вопрос:

Я потратил на это несколько часов и, похоже, не могу пройти мимо этого. Я видел в старом сообщении stack overflow (около 5 лет назад), что фильтрация сканирования ble по имени устройства была нарушена в Android, поэтому вам приходилось делать это вручную для каждого из возвращаемых результатов сканирования. Я надеюсь, что это уже исправлено, и я просто делаю ошибку новичка, которую кто-то может легко обнаружить.

Я использую Kotlin для выполнения сканирования ble. Мой код отлично работает, когда фильтр имеет значение null, но я не смог заставить его работать, используя имя устройства (объявленное имя устройства) в качестве фильтра. Приведенный ниже код с фильтром компилируется, но вылетает на моем планшете Nexus 7 (Android 6.0.1) при запуске сканирования ble (я включил только то, что, я надеюсь, имеет отношение к ясности).

Я использую следующий код (все в MainActivity.kt) для создания фильтра для устройства с именем «RCTL003»:

 import android.bluetooth.le.ScanFilter as LeScanFilter
// After the class declaration for MainActivity
// Here's the scanner.
private val bleScanner by lazy {
    bluetoothAdapter.bluetoothLeScanner
}
// Here's the device name "RCTL003"
private val filter = LeScanFilter.Builder().setDeviceName("RCTL003").build()
private lateinit var devfilters: MutableList<LeScanFilter>
...
// I init devfilters just before I start the scan in my startBleScan function
devfilters.add(filter)
bleScanner.startScan(devfilters, scanSettings, scanCallback)
 

bleScanner.startScan принимает изменяемый список типа ScanFilter:

 startScan((Mutable)List<ScanFilter!>!, ScanSettings!, ScanCallback!) defined in android.bluetooth.le
 

Любые указания будут высоко оценены!

Джим

Комментарии:

1. Я предлагаю попробовать это лучший пример для Android BLE

2. Спасибо за быстрый ответ. Я просмотрел код по ссылке, но не увидел ничего, связанного с фильтрацией сканирования. Возможно, фильтрация сканирования по имени устройства по-прежнему нарушена, поэтому мне придется вручную фильтровать с помощью кода: (

Ответ №1:

Изменив способ определения devFilters, фильтр сканирования по имени устройства работает!

Указанные выше devFilters должны быть определены как:

 private devfilters: MutableList<LeScanFilter> = ArrayList()
 

Я использую minSdk из 23.