Intereting Posts
Как получить имя файла и реальный путь к файлу диска Google? Ошибка учебника для Android: R не может быть разрешено переменной Android MapView в фрагменте Динамический добавочный элемент для NavigationView в Android Изменение атрибутов приложения с помощью API файлов Phonegap Атрибут, уже определенный с несовместимым форматом Компиляция строки как кода во время выполнения на Android Как возобновить работу с MediaPlayer в Android после нажатия кнопки «домой» и повторного открытия приложения Как получить ссылку на внешний класс из внутреннего класса, не используя имя внешнего класса? Какой порядок вложенных макетов наиболее эффективен в Android Проблема с функциями ожидания ожидания в библиотеке Volley (PriorityBlockingQueue.java) В чем разница между -keep и -keepclassmembers в ProGuard? Как использовать DecimalFormat для форматирования денег? Что такое область зависимости по умолчанию в Gradle на Android? Есть ли что-то похожее на систему ресурсов Android в меньшем масштабе?

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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