#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.