我已經創建了一個輸入設備驅動程序,用於控制應用程序中的鼠標/鍵盤。一切工作到目前爲止,我可以在應用程序內爲鍵盤和鼠標生成輸入事件。Android kcm文件似乎不起作用。我錯過了什麼?
我現在面臨的問題是我無法輸入不在鍵盤上的特殊字符。如果我想輸入eszett(ß),我不能模擬我的輸入設備的按鍵。
如果我沒有弄錯,關鍵字符映射文件應該能夠解決這個問題。我可以將unicode字符映射到某些鍵,然後模擬該鍵的按鍵並輸入字符。
我試過了,但它不起作用,我不明白爲什麼它不起作用。我複製了Virtual.kcm文件並將其重命名爲代表我的設備供應商和產品ID。爲了試驗,我更換了一個行文件中輸入時0鍵被按下的eszett,而不是一個「0」:
key 0 {
label: '\u00df' // instead of '0'
base: '\u00df' // instead of '0'
shift: ')'
}
我確信,輸入設備通過檢查使用正確的KCM文件「dumpsys輸入」的輸出:
6: custom-input
Classes: 0x8000006b
Path: /dev/input/event5
Descriptor: ab3fb155bce23398b91099a8f37d5cae61f29d21
Location:
UniqueId:
Identifier: bus=0x0003, vendor=0x1111, product=0x2222, version=0x0001
KeyLayoutFile: /system/usr/keylayout/Vendor_1111_Product_2222.kl
KeyCharacterMapFile: /system/usr/keychars/Vendor_1111_Product_2222.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: true
一切都看起來不錯,到目前爲止,但是當我實際生成使用的SendEvent輸入事件,但它仍然進入一個「0」,而不是一個eszett。
sendevent /dev/input/event5 1 11 1 (KEY_EV, KEY_0, DOWN)
sendevent /dev/input/event5 0 0 0 (SYNC)
sendevent /dev/input/event5 1 11 0 (KEY_EV, KEY_0, UP)
sendevent /dev/input/event5 0 0 0 (SYNC)
我真的很期待這個工作,但顯然它沒有。有什麼我失蹤?
通過輸入設備使用kcm文件(或以其他方式)輸入unicode字符的解決方案是什麼?
在我的特殊情況下,我是'OEM'。雖然沒有涉及物理設備,但我爲虛擬設備編寫了驅動程序。我確實提供了設備的關鍵字符映射(kcm文件),但它沒有做它應該做的事情。我可能錯過了一些東西。 –
我看到,我不認爲我可以幫助這個人,因爲我在hal層工作(如OEM),但現在您告訴我這一點,問題可能與駕駛員有關。您是否檢查過您正在使用的「虛擬物理接口」未被其他驅動程序使用?可能是一個很長的鏡頭,但我現在在android中的幾個驅動程序是多路複用的,但有時由於它們互相干擾的錯誤。無論如何,我已經看到這在android發生了很多。但缺乏這方面的經驗來幫助你。我希望你在這個問題上運氣並取得成功。 – Jorch914