Как изменить фон навигационной панели (а не только цвет), даже если не на переднем плане?

Фон

Как-то приложение " Приложения Navbar" позволяет настроить фон навигационной панели, даже если это не на переднем плане и даже не просто простой цвет.

введите описание изображения здесь

Проблема

Я думал, что изменить цвет можно только, и только когда приложение находится на переднем плане...

Я видел это на некоторых пользовательских ромах, даже имея специальные эффекты при воспроизведении музыки, но я не знал, что можно настроить его даже без пользовательского rom (или root).

Вопросы

  • Это взломать? Как они меняются, а не только цвет панели навигации, но даже устанавливают фоновое изображение для него (в том числе динамическое, для состояния батареи)?

  • Можно ли также изменить другие системные панели, например панель уведомлений?

  • Как проверить, какое приложение находится на переднем плане (необходимо для определения того, когда можно изменить цвет на основе текущего приложения, возможно)? Это новый API? Я думал, что API для работы переднего плана устарел и теперь ничем не помогает...

Ответы

Ответ 1

Базовая установка довольно проста. Запуск его в приложение займет определенную работу.

Вам необходимо использовать API Доступность, а также WindowManager#addView(...).

Это взломать?

Я не могу сказать, что мне нравится эта идея, но это не совсем хак.

Как они меняются, а не только цвет навигации бар, но даже установить фоновое изображение для него (в том числе динамическое, для состояния батареи)?

Поскольку мы добавляем View (или ViewGroup), у нас намного больше контроля.

Можно ли также изменить другие системные панели, например панель уведомлений?

Я рассмотрю это.

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

Вы можете использовать API Accessibility для прослушивания изменений уровня Window (AccessibilityEvent) - это даст вам имя_пакета. Используйте его как хотите.

Я дам вам несколько указателей:

манифеста

  • : SYSTEM_ALERT_WINDOW
  • Объявление службы доступности: <service />

Accessibilityservice

  • Наполните, инициализируйте и добавьте свой макет в: onServiceConnected()
  • Я использовал TYPE_SYSTEM_OVERLAY с WindowManager#addView(...)
  • Слушайте AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
  • Переопределить onAccessibilityEvent(AccessibilityEvent); имя_пакета будет доступно здесь

Результат

введите описание изображения здесь

Здесь представлен пример проекта: Ссылка.