Сканирование RSSI: onBluetoothLeDeviceFound Callback не вызывается на пикселе 1 - PullRequest
0 голосов
/ 03 марта 2020

Я работаю над сканером RSSI для Android. Я хочу архивировать это с помощью постоянного сканирования устройств BLE. Таким образом, если нужно определить RSSI устройства, оно должно рекламироваться через BLE. Измерительное устройство начинает сканирование с очень короткими интервалами, и, как только он находит рекламодателя, RSSI может быть прочитан в результате сканирования. Это приводит к следующему коду на стороне рекламодателя:

fun beginAdvertise() {
    val advertiser = BluetoothAdapter.getDefaultAdapter().bluetoothLeAdvertiser
    val settings = AdvertiseSettings.Builder()
        .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
        .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
        .setConnectable(false)
        .build()

    val data = AdvertiseData.Builder()
        .setIncludeDeviceName(true)
        .build()

    val advertisingCallback = object : AdvertiseCallback() {
        override fun onStartFailure(errorCode: Int) {
            Log.e("BLE", "Advertising onStartFailure: " + errorCode);
            super.onStartFailure(errorCode)
        }
    }
    advertiser.startAdvertising(settings, data, advertisingCallback);
}

Функция для сканирующего устройства вызывается каждые 20 мс (я пробовал гораздо более длительные задержки) и выглядит следующим образом:

private val onBluetoothLeDeviceFound = object : ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult?) {
        result?.let {...}}

fun startScan() {
            val scanner = mBluetoothAdapter?.bluetoothLeScanner
            val scanSetting =
                ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                    .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE).build()
            scanner?.startScan(
                null,
                scanSetting,
                onBluetoothLeDeviceFound
            )
         }

Этот код отлично работает на моих устройствах Pixel 2. Но если я попробую его на устройствах Pixel 1 (одно на Android 9, другое на Android 10), обратный вызов onBluetoothLeDeviceFound не будет вызван. У меня есть эти разрешения:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCTION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

Я действительно не знаю, что мне следует попробовать дальше. Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 03 марта 2020

Решение было простым, но трудоемким. Вам не нужно просто иметь разрешения на определение местоположения, но вам также нужно включить службы определения местоположения! На устройствах Pixel 2 они были включены случайным образом, поэтому он работал там, но не на Pixel 1.

...