2016-05-03 7 views
0

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

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

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

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

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

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

Сердечные приветы Jan Тилеманн

+0

Как это принято, это звучит как не по теме и относится к нему в другом месте (например, Super User). – ozbek

+0

чтение из/dev/input/eventX? (select(), poll()) - https://www.kernel.org/doc/Documentation/input/ – subin

ответ

0

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

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

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

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