Определить видимость строки состояния в службе доступности

Кто-нибудь знает какие-либо хорошие способы определить, видна ли строка состояния в службе доступности? (в частности, обнаружение разницы между экраном блокировки и панелью уведомлений или экраном последних приложений и всплывающим окном громкости)

Я уже добавил вид через WindowManager, который обнаруживает изменения макета и сравнивает его высоту с высотой экрана, однако это не работает при любых обстоятельствах.

Я еще не нашел надежного способа определить, какой экран systemui какой, или строка состояния видна в любом из них. Панель уведомлений обычно имеет имя класса "android.widget.FrameLayout", которое я использовал для его обнаружения до сих пор, но это иногда неправильно определяет экран блокировки или всплывающее окно громкости как панель уведомлений. Просто выяснить, приводит ли ComponentName к активности, достаточно, чтобы исключить экран блокировки (в основном) и последние приложения. Панель громкости, однако, иногда отображается над строкой состояния, а иногда и ниже, в зависимости от производителя (я хотел бы избежать создания базы данных различных устройств любой ценой). Я также не могу обнаружить закрытие панели громкости; Я получаю событие только тогда, когда оно открывается.

Если бы я мог получить тему источника события доступности, я мог бы потенциально использовать атрибут 'android: windowFullscreen' для решения всей проблемы, но я нашел способ сделать это только для действий. Если вы хотите взглянуть на слегка неорганизованный исходный код, над которым я работаю, вот ссылка: https://github.com/TheAndroidMaster/Status

1 ответ

Я придумал временное решение для этого, используя комбинацию android.media.VOLUME_CHANGED_ACTION широковещательная рассылка (которая также отправляется при открытии панели громкости) и отложенный запуск.

Поскольку действие с измененным объемом отправляется только на Lollipop, для других устройств я ожидаю получения события доступности, а затем проверьте, AccessibilityEvent.getText() содержит слово "объем". Это может привести к сбою на некоторых нестандартных устройствах. Однако это слово присутствует во всех стандартных версиях Android, даже если язык по умолчанию не английский. Он также проверяет, что слово "скрытый" не включено, так как событие доступности отправляется дважды на нугу. Это умеренно надежное решение, и оно должно работать нормально, пока не будет найден лучший метод.

Другие вопросы по тегам