Android BLE Scan - Невозможно запустить сканирование без фильтров при выключенном экране - PullRequest
1 голос
/ 13 июля 2020

Я столкнулся с проблемой, связанной со сканированием рекламы BLE. После выключения экрана мое сканирование работает неопределенное время, а затем останавливается, пока я не включу экран. BtGatt.ScanManager регистрирует «Невозможно запустить неотфильтрованное сканирование при выключенном экране».

Я предоставляю фильтры сканирования, как показано ниже

class IBeaconScanFilterProvider : BeaconScanFilterProvider {
    override fun get(uuid: UUID): ScanFilter {
        val manufacturerData = ByteBuffer.allocate(23)
        val manufacturerDataMask = ByteBuffer.allocate(23)
        val uuidBytes = getByteArrayFromGuid(uuid.toString())!!

        for (i in 2..17) {
            manufacturerData.put(i, uuidBytes[i - 2])
            manufacturerDataMask.put(i, 0x01)
        }

        return ScanFilter.Builder()
            .setManufacturerData(
                0x004C, //IBeacon
                manufacturerData.array(),
                manufacturerDataMask.array()
            ).build()
    }
}

Затем я начинаю сканирование с использованием кода ниже

bluetoothScanner.startScan(
            arrayListOf(beaconScanningContext.filters),
            beaconScanningContext.settings,
            RxBleBroadcastReceiver.newPendingIntent(context)
        )

Каждые 10 минут я сбрасываю сканирование, чтобы избежать блокировки, которая отключает сканирование через 10 минут, добавлено в android 8

Я тестирую это решение на Android 5.1 (LG G2), Android 7.1.1 (Nexus 6P), Android 8.1 (Pixel XL) и Android 10 (Xiaomi Mi9), и возникла проблема на Pixel и Mi9

Что-то я делаю неправильно?

1 Ответ

1 голос
/ 13 июля 2020

Подход, который вы описываете, является правильным. Вы правы, что вам нужно периодически перезапускать сканирование, иначе сканирование будет остановлено. Это изменение вошло в Android 7.0, и оно должно было произойти после 30 минут сканирования (хотя возможно, что некоторые OEMS настроили это). См. здесь

Ограничение на фоновое сканирование без фильтра сканирования началось с Android 8.1 и выполняется немного по-разному между OEM-производителями. На телефонах Pixel и AOSP работает любой фильтр сканирования, даже пустой. На Samsung требуется непустой фильтр сканирования. См. здесь для получения дополнительной информации.

Непонятно, почему ваш фильтр сканирования не работает, чтобы решить эту проблему. Фильтр, созданный IBeaconScanFilterProvider, выглядит достаточным, но я не вижу из показанного кода, что возвращается beaconScanningContext.filters. Вы уверены, что это возвращает массив хотя бы из одного элемента с непустым фильтром сканирования? Если да, то должно работать.

...