Android ScanSetting для Marshmallow Android

Я хотел бы создать свои настройки сканирования в Android M, чтобы получить отдельные обратные вызовы для трех разных событий в одном объекте ScanCallback :

  1. Когда удаленное устройство сначала соответствует фильтру
  2. Когда телефон Android получил рекламные объявления после первого открытия (в этом случае я проверяю, изменились ли рекламные данные или нет)
  3. Когда удаленное устройство выходит за допустимые пределы

В API есть три варианта:

 CALLBACK_TYPE_ALL_MATCHES CALLBACK_TYPE_FIRST_MATCH CALLBACK_TYPE_MATCH_LOST 

К сожалению, нет хорошей документации о том, могут ли эти три варианта использоваться совместно или нет. Согласно моим экспериментам, я должен выбрать только один из них. Требует ли API от нас отделить одновременное сканирование, чтобы получить обратный вызов для CALLBACK_TYPE_ALL_MATCHES и CALLBACK_TYPE_MATCH_LOST одновременно? У кого-нибудь есть хороший опыт использования этих опций?

EDIT :

После проверки исходного кода API я узнал, что CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST также является допустимой комбинацией. Однако использование CALLBACK_TYPE_FIRST_MATCH делает его значительно медленнее (~ 30 секунд) для обнаружения по сравнению с CALLBACK_TYPE_ALL_MATCHES . Кроме того, вызывается CALLBACK_TYPE_MATCH_LOST хотя устройство активно рекламирует. Я не думаю, что этот API надежный.

Вот мои результаты:

12: 02: 50.179 31627-31655 D / BluetoothLeScanner: onClientRegistered () – status = 0 clientIf = 6
12: 03: 24.877 31627-31627 D / ScanCallbackMarshmallow: ScanResult {mDevice = E8: A8: C9: 82: 17: 61, …}
12: 03: 24.878 31627-31627 D / ScanCallbackMarshmallow: CALLBACK_TYPE_FIRST_MATCH
12: 03: 29.905 31627-31627 D / ScanCallbackMarshmallow: ScanResult {mDevice = C0: B6: 43: 1E: 45: 28, …}
12: 03: 29.906 31627-31627 D / ScanCallbackMarshmallow: CALLBACK_TYPE_FIRST_MATCH
12: 03: 39.721 31627-31627 D / ScanCallbackMarshmallow: ScanResult {mDevice = D8: 35: 26: 9D: 55: B4, …}
12: 03: 39.722 31627-31627 D / ScanCallbackMarshmallow: CALLBACK_TYPE_FIRST_MATCH

12: 04: 21.889 718-730 D / BluetoothLeScanner: onClientRegistered () – status = 0 clientIf = 6 12: 04: 22.073 718-718 D / ScanCallbackMarshmallow: ScanResult {mDevice = D8: 35: 26: 9D: 55: B4, …} 12: 04: 22.073 718-718 D / ScanCallbackMarshmallow: CALLBACK_TYPE_ALL_MATCHES 12: 04: 22.316 718-718 D / ScanCallbackMarshmallow: ScanResult {mDevice = E8: A8: C9: 82: 17: 61, …} 12 : 04: 22.316 718-718 D / ScanCallbackMarshmallow: CALLBACK_TYPE_ALL_MATCHES 12: 04: 24.740 718-718 D / ScanCallbackMarshmallow: ScanResult {mDevice = E8: A8: C9: 82: 17: 61, …} 12: 04: 24.740 718 -718 D / ScanCallbackMarshmallow: CALLBACK_TYPE_ALL_MATCHES

EDIT 2 :

Настройка режима сканирования как ScanSettings.SCAN_MODE_LOW_LATENCY делает обнаружение с использованием CALLBACK_TYPE_FIRST_MATCH так же быстро, как с помощью CALLBACK_TYPE_ALL_MATCHES . Однако, если я устанавливаю тип обратного вызова как ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST Я не смогу проверить, изменились ли рекламные данные или нет, в случае, если рекламные данные являются динамическими. Я думаю, что это проблема с API. Следует отметить, что данные рекламы не предсказуемы, поэтому я не могу фильтровать рекламные данные на основе его содержимого.

Intereting Posts
FFMPEG sws_scale Crash на Android Диалоговое окно выбора даты отображается при редактировании текста с двойным щелчком API в android для Bluetooth Служба мгновенного оповещения в разделе «Найти меня» Android InstantRun – Norton Security находит трояна Контакты для Android: неправильная локальная сортировка / сортировка Android Studio Preview 3.0 – При установке приложения не удалось выполнить мгновенное приложение Открытие webview не в новом браузере Разница между кнопкой «Действие» и кнопкой «Назад назад» GCM defaultSenderID Лучший способ Android получить местоположение в фоновом режиме с учетом батареи Быстро движущиеся тела пропускают столкновение, иногда в Box2d, AndEngine Тестирование на Android: TestCase запущен, но ActivityInstrumentationTestCase2 не Android-программирование: как рисовать многострочный текст в прямоугольнике? Требуется Gradle версия 2.10. Текущая версия 2.8 Ошибка Запись звонков – заставить работать Nexus 5X (возможно создание корневого или пользовательского ПЗУ)