Получение скрытой строки состояния/вход в полноэкранное событие активности в службе

У меня есть служба, которая добавляет некоторые представления в оконный менеджер (что-то вроде головок чата facebook). Эти виды всегда остаются на высоте, даже когда я нахожусь в приложении камеры. Можно ли узнать, когда какое-либо действие (например, камера или видеоплеер) использует полноэкранный режим, чтобы я мог скрыть свои представления?

Редактировать:

Есть что-то под названием View.OnSystemUiVisibilityChangeListener, но для этого требуется API 11. Моя цель — 9, но похоже, что это именно то, что мне нужно. Любая альтернатива для API 9?


person Daniel    schedule 31.08.2013    source источник


Ответы (1)


Хорошо, если кому-то интересно, я решил свою проблему следующим образом: добавил прозрачный вид в оконный менеджер с шириной 1px и высотой match_parent. Затем добавил к этому представлению прослушиватель глобального макета, и каждый раз, когда в макете происходит изменение, я проверяю положение этого представления на экране. Если Y равно 0, то строка состояния не видна, поэтому должно быть запущено полноэкранное приложение. Это работает даже лучше, чем собственный View.OnSystemUiVisibilityChangeListener, потому что кажется, что есть некоторые приложения, которые каким-то образом не запускают этот метод (например, новая погода Yahoo).

person Daniel    schedule 05.10.2013
comment
Блестящий. Эта концепция основана на том факте, что координата y вида на экране (полученная с помощью view.getLocationOnScreen(locationArray)) будет автоматически уменьшена на высоту строки состояния, когда любое приложение входит в полноэкранный режим и скрывает строку состояния ( и наоборот). Изменение y запускает onLayoutChangeListener, прикрепленный к представлению из-за перерисовки представления. - person Kevin Lee; 17.02.2016
comment
Однако я только что столкнулся с большой проблемой - getLocationOnScreen ненадежен при изменении ориентации. Например. из неполноэкранного приложения, запустите полноэкранное приложение, которое сразу же изменит ориентацию, а затем нажмите кнопку «Домой». GetLocationOnScreen не обновляется правильно. - person Kevin Lee; 19.02.2016
comment
Я нашел метод, который не зависит от getLocationOnScreen! В основном то же самое, что и ваш метод, просто мы проверяем, равна ли высота представления (getHeight()) высоте окна в прослушивателе макета; если они равны, это означает, что приложение находится в полноэкранном режиме. И onConfigurationChanged, мы должны помнить об обновлении высоты окна, к которому обращается windowSize.y, используя windowManager.getDefaultDisplay().getSize(windowSize); stackoverflow.com/a/34215751/2669960 - person Kevin Lee; 19.02.2016