Android/Linux: журнал использования ключа (мощности) на более низком системном уровне.

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

Я просто хочу регистрировать все взаимодействия с аппаратными кнопками на более низком уровне, чем движок Dalvik. Я очень новичок в разработке для Android и никогда не разрабатывал на базе Linux/Unix, но у меня есть минимальный опыт работы с C.

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

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

Теперь, поскольку я очень новичок в этой теме, и мои знания ограничены в данный момент, мои первые идеи состояли в том, чтобы либо иметь процесс linux, либо расширение ядра для выполнения этой работы. Позже я мог бы захотеть заполнить свои собственные сообщения, события или что-то еще, что я мог бы получить в приложении или фоновой службе через JNI (если я правильно понял) позже.

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

С уважением Ян Тилеманн


person xxtesaxx    schedule 03.05.2016    source источник
comment
Как говорится, здесь это звучит как не по теме и относится к другому месту (например, Super User).   -  person ozbek    schedule 03.05.2016
comment
читать из /dev/input/eventX? (select(), poll() ) - kernel.org/doc/Documentation/input   -  person subin    schedule 03.05.2016


Ответы (1)


Проведя дополнительные исследования, я обнаружил, что метод interceptKeyBeforeDispatching в Android PhoneWindowManager.java — это место, к которому я могу подключиться.

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

Я использовал перехватчики метода перед методомHookedMethod() для проверки интересующих меня событий KeyEvent. Насколько я могу судить, я могу перехватить KeyEvent (например, KeyEvent.KEYCODE_POWER) и выполнить свой собственный код, но все же позволить системе решить, что делать с событием.

Я даже могу проверить шаблоны (например, нажатие от 3 до 5 секунд, за которым следует короткое нажатие менее 1 секунды), чтобы выполнить мой код. Удерживая питание в течение 5 секунд, система по-прежнему предлагает мне выключить или перезагрузить устройство, но мой код также выполняется.

person xxtesaxx    schedule 06.05.2016