У меня есть планшет Asus P00A (Android 7.0, API24), на котором BLE останавливается через несколько часов. (Это влияет на любое приложение BLE, а не только на мое приложение, использующее Android Beacon Library). Приложения снова начнут работать, если я вручную выключу BLE, а затем снова включу.
Система автоматического исправления BluetoothMedic не работала на моем планшете. Он запускается каждые 15 минут, но не обнаруживает неисправностей и, следовательно, не «выключает и выключает» Bluetooth. Однако я взломал класс BluetoothMedic, добавив следующее:
public void cycleBluetooth (контекстный контекст) {...}
и прикрепил это к кнопке. Я считаю, что это восстановит функциональность BLE. Поэтому мне стало интересно, что произойдет, если я безоговорочно сбрасываю BLE каждые 15 минут. Я добавил:
общедоступный статический конечный int ALWAYS_RESET = 4;
а затем вызовите medic.enablePeriodicTests (context, BluetoothMedic.ALWAYS_RESET);
и добавьте код в BluetoothTestJob.onStartJob (), который затем вызывает BluetoothMedic.cycleBluetooth (). Это ведет себя так, как ожидалось, и до сих пор мое приложение отлично работало в течение 18 часов.
Меня интересуют любые советы, например:
1 Существуют ли какие-либо тесты, кроме двух в BluetoothMedic, которые я могу запустить, чтобы определить, что Bluetooth моего планшета остановился? (С удовольствием экспериментирую).
2 Есть комментарии по поводу взлома, который я описал выше? Можно ли безоговорочно сбрасывать Bluetooth каждые 15 минут?
3 Если Bluetooth сброшен ("выключен и снова выключен"), то все в порядке с остальной частью библиотеки Android Bluetooth? То есть будет ли он продолжать мониторинг и ранжирование, которые были ранее настроены, или в коде приложения необходимо установить какие-либо действия, чтобы все снова заработало? Обратите внимание, что это применимо к сбросам с помощью существующего кода enablePowerCycleOnFailures (), а также моего взлома ALWAYS_RESET выше. (Может быть, есть какие-то сбои, которые могут произойти, если выключение и включение питания произошло не в то время?).
4 Могу ли я предложить добавить обратный вызов, чтобы приложение могло узнать, был ли включен цикл Bluetooth? Возможно в качестве параметра enablePowerCycleOnFailures ()
5 Я понимаю, что фоновые действия могут быть остановлены ОС, особенно с Android 8. Повлияет ли это также на регулярные 15-минутные тесты, настраиваемые с помощью enablePeriodicTests ()?
BluetoothMedic Android Beacon LIbrary, в том виде, в каком он сейчас построен, полагается на код ошибки операционной системы, возвращаемый в результате сбоя сканирования (или сбоя рекламы), чтобы определить, находится ли стек bluetooth в плохом состоянии, требующем перезапуска питания.
Для сканирования, если обратный вызов onScanFailed вызывается с кодом ошибки SCAN_FAILED_APPLICATION_REGISTRATION_FAILED, который имеет значение 2, модуль считает его достойным цикла питания..
Для рекламных объявлений, если обратный вызов onStartFailed вызывается с кодом ошибки ADVERTISE_FAILED_INTERNAL_ERROR, который имеет значение 4, модуль считает, что он стоит цикла питания..
Эти значения были определены путем экспериментов, свидетельствующих о том, что на некоторых устройствах после вызова обратного вызова с этими значениями bluetooth на устройстве не будет работать снова, не выключив и не включив его снова. Вы можете увидеть обсуждение этого в этой теме.
Возможно, вы захотите проверить, есть ли на Asus P00A другие коды ошибок, которые указывают на проблему, достойную включения Bluetooth. Для этого дождитесь сбоя и посмотрите, вызывают ли попытки начать сканирование обратный вызов onScanFailed с отдельным кодом ошибки. Если такие коды ошибок существуют, это было бы лучшим решением, чем регулярное включение и выключение питания Bluetooth, поскольку повторное включение питания Bluetooth действительно нарушает соединения BLE GATT и работу классических функций Bluetooth, таких как динамики. Сама Android Beacon Library прекрасно восстанавливается после этих циклов питания, хотя, очевидно, она не будет обнаруживать маяки, пока Bluetooth не будет снова включен.
Поскольку BluetoothMedic использует Планировщик заданий Android для периодических тестов, на него не влияют фоновые ограничения в Android 8+.
Если вы заинтересованы в расширении этих функций в библиотеке, не стесняйтесь открывать проблему в репозитории Github и выдавать пул реквест, если у вас есть код, которым вы хотите поделиться.