Проверьте использование кнопки громкости, когда экран выключен

По этому вопросу я приведу другого пользователя, который не ответил на их вопрос:

Я написал приложение Andoid, которое использует аппаратные кнопки громкости для другой цели.

Он отлично работает, если приложение работает и видимо, но когда я поворачиваю выключить или отключить тайм-аут, нажатие кнопки не попадает в мой обработчики.

Кто-нибудь знает, есть ли способ обнаружить эти нажатия кнопок, когда экран выключен? Источник: Вопрос AV695

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

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

Ответы

Ответ 1

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

В рамках разумных модификаций системного ROM более разумным может быть изменение существующего ПЗУ с открытым исходным кодом для устройства для вставки некоторого кода пользовательского уровня платформы в обращение с кнопкой питания, обычно используемой для пробуждения устройства подготовительный к ее разблокировке - что, по крайней мере, мы знаем, обращает внимание на ядро. Этот код может затем информировать пользователя по звуку или вибрации, если есть непризнанные уведомления.

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


Или вы не могли использовать клавишу громкости и просто устанавливать таймер, чтобы просыпаться каждые 15 минут и вибрировать, если есть неподтвержденные уведомления, избегая необходимости шарить в них.


Вы упомянули пользовательский запрос: если это подразумевает его одностороннее или малообъемное, другой вариант, который следует учитывать, заключается в том, что у нескольких поставщиков есть "Bluetooth-часы" с SDK, который позволяет выталкивать уведомления с устройства Android.

Если вы можете зафиксировать уведомление, когда оно сгенерировано, вы можете нажать его на запястье пользователя, а затем позволить телефону снова заснуть.

Ответ 2

Вы не можете перехватить ключ, пока ваше приложение находится в фоновом режиме, но вместо того, чтобы прослушивать сам KeyPress. Вы можете зарегистрировать ContentObserver, как описано в этом вопросе.

Ответ 3

Как отметил Крис Страттон, единственный способ сохранить ваше приложение в живом состоянии - это использовать блокировки от бодрствования.

Однако, поскольку я оказался в той же ситуации, я придумал другое решение. К сожалению, вам понадобится внедренное устройство, а также инфраструктура Xposed.

С помощью Xposed, который заменяет процесс zygot, вы можете привязать себя к любому конструктору и методу системы, вы сможете поймать необработанные KeyEvents, прежде чем система их обработает.

Это делается в PhoneWindowManager.interceptKeyBeforeQueueing(). Используя XC_MethodHook, вы можете использовать beforeHookedMethod() по вышеупомянутому методу, чтобы поймать каждое событие кнопки устройства, даже если устройство находится в глубоком сне.

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

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

Ответ 4

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

Фоновый видеорегистратор 2 (BVR2) (и возможный BVR1 также, я не пробовал) - это одно из приложений, которое может обнаруживать нажатие клавиши громкости даже тогда, когда экран выключен. При попытке реализовать обнаружение ключа тома, когда экран отключен в моем приложении, я установил BVR2, надеясь найти, как он работает. К моему удивлению, это дало моему приложению возможность обнаруживать клавиши громкости, даже когда экран выключен. Мое приложение имело ContentObserver для контроля изменений громкости, но не работало, когда экран выключен. Когда BVR2 активен, мое приложение также может обнаружить нажатие клавиши громкости, когда экран выключен. Все еще рытье.

Но у BVR2 есть свое собственное действие триггера, то есть запись видео, действие, которое вы, возможно, не захотите, только ради того, чтобы приложение обнаружило нажатия клавиш громкости.

Другое приложение - QuickClick. Это приложение может предоставить вашему приложению то, чего ему не хватает, возможность обнаруживать нажатия клавиш громкости, даже когда экран выключен, без дополнительных нежелательных действий. Просто установите QuickClick и не настройте никаких действий. Создайте ContentObserver, чтобы отслеживать изменения объема потока, и вы готовы. Теперь приложение сможет обнаруживать нажатия клавиш громкости, даже если экран выключен.

Обратите внимание, что мое приложение работает как справочная служба.

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

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

Если вы найдете этот ответ полезным, пожалуйста, проголосуйте.

Ответ 5

Я не уверен, насколько это просто, но проверьте этот блог для Android:

Разрешить приложениям играть приятно (r) друг с другом: Работа с кнопками дистанционного управления

В нем объясняется использование широковещательного приемника, который получает регуляторы громкости вверх/вниз и другие музыкальные элементы управления.

В заключение вы должны использовать registerMediaButtonEventReceiver