Каков в Андроиде механизм обработки аппаратных клавиш?

Добрый день!


Имеется Андроид-бокс на Cortex A9, разумеется рутованный, используемый в CarPC с USB мини-клавой. Функ. клавиши назначены на основные действия Андроида: переход на домашний экран (HOME), управление плеером, «настройки», вызов области уведомлений итд итп.


В какой-то момент после обновления прошивки кнопка HOME перестала работать. Конфигурация хард-клавиш у меня настроена через /system/usr/keylayout/


Примерное содержимое файла aml-usbkbd.kl:


key 1 BACK # ESC

key 59 MENU # F1

#key 60 CAMERA # F2

key 61 NOTIFICATION # F3

key 62 HOME # F4

key 63 MEDIA_PREVIOUS # F5

key 64 HEADSETHOOK # PLAY/PAUSE F6

#key 65 INFO # F7

key 66 VOLUME_UP # F8

key 67 VOLUME_DOWN # F9

key 200 HEADSETHOOK #

key 68 MEDIA_NEXT # F10

key 87 POWER # F11

#key 88 EMAIL # F12


Коды клавиш пробовал менять между собой: сами клавиши и их опрос работает, а именно не работает вызов функции HOME. «Заводская» иконка в виде домика сверху тоже не работает. Но при этом кнопка HOME в Button Savior (эмулятор хард-кнопок на экране) работает нормально. Вызов домашнего экрана из SSH командой am start -a android.intent.action.MAIN -c android.intent.category.HOME тоже работает.


Пока я эту проблему «решил» путём написания командного .sh файла, запускаемого при старте, которые опрашивает устройства через getevent и выполняет нужную команду, однако эта штука во-первых, страшно тормозит, во-вторых, вылетает через некоторое время, т.к. её убивает ядро Андроида.


Как вообще конфигурируются эти клавиши и где назначается выполняемое ими задание? Я бы хотел добавить ещё несколько клавиш, например, для вызова навигации итд итп. Облазил весь инет, так и не нашёл никакой инфы. Или, может быть, есть софт, который выполняет подобные действия? Насколько я понял, в Андроиде нельзя как в Винде висящей в памяти программой постоянно читать клавиатуру, а только активити, чьё окно открыто в данный момент — защита от кейлоггеров…


Спасибо.
  • Вопрос задан
  • 9457 просмотров
Решения вопроса 1
@elgordo Автор вопроса
Неожиданно было найдено решение. В Андроиде имеется база настроек в формате SQLite3:

/data/data/com.android.providers.settings/databases/settings.db

Это что-то наподобие виндузового реестра. В ней должен быть параметр device_provisioned, значение 1. При его отсутствии именно проявляется эффект не работы кнопок HOME и SEARCH.

Чтобы исправить, сливаем этот файл на компьютер и открываем редактором, я использовал SQLiteman. Выполняем запрос:

INSERT INTO secure (name,value) VALUES ('device_provisioned','1');

Сохраняем, заливаем обратно, перезагружаемся. Кнопка HOME равно как и значок «домика» сверху заработали. )) При сохранении важно проверить, что файл остался в формате SQLite3 и что не изменились разрешения (у меня было 0660). В противном случае вас ждёт перепрошивка. ))

В принципе базу можно отредактировать локально, но на моём девайсе файла sqlite3 не обнаружилось.

Решение это я нашёл здесь:

forum.cyanogenmod.org/topic/19605-home-button-issues-striking-back/

Cyanogenmod я не использую, чем это всё объясняется, я понятия не имею. :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@constv
пара ссылок: раз и два
Ответ написан
Комментировать
@elgordo Автор вопроса
Ну это и есть тот самый метод который я использую сейчас. Хотя, в статьях больше обсуждается передача кодов клавиш, а не чтение.
Только у меня это в командном файле и запускается через autostart.sh

while true  
do

s=$(getevent -v0 -c1)  # считываем одно событие из всех устройств ввода
s=$(echo $s | awk '{print $4}') #выделяем код клавиши

case $s in    # выполняем нужную команду

    0007003d) am start -a android.intent.action.MAIN -c android.intent.category.HOME
    sleep 1
    ;;

esac

done



Как я писал, во-первых, это работает медленно (от нажатия клавиши до запуска приложения иногда проходит
несколько секунд!), во-вторых, ядро успешно убивает этот процесс через некоторое время.

Меня интересует где находится и как работает нативный андроидовский обработчик этих событий.
Ответ написан
Комментировать
@constv
ответ от Nfc666 с 4pda.ru:
Ковырять нужно /system/framework/android.policy.jar, именно там происходит обработка.
Вооружаться dex2jar, JDGUI, APKTools для декомпиляции и анализировать код.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы