2015-09-07 122 views
4

我已經創建了一個輸入設備驅動程序,用於控制應用程序中的鼠標/鍵盤。一切工作到目前爲止,我可以在應用程序內爲鍵盤和鼠標生成輸入事件。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字符的解決方案是什麼?

回答

1

「的Android目前不支持多語言鍵盤。此外,內置的通用鍵字符映射假定美國英語鍵盤佈局。

鼓勵

原始設備製造商爲他們的鍵盤提供自定義鍵字符映射,如果它們被設計

未來的Android版本可能會更好地支持多語言鍵盤或用戶可選擇的鍵盤佈局。「提取自https://source.android.com/devices/input/key-character-map-files.html#examples

請注意,在文檔的這個片段中,它說OEM鼓勵提供自定義關鍵字符映射。所以這是你問題的可能原因。 您正在使用的設備的OEM(原始設備製造商)可能沒有實現自定義多語言鍵盤支持。由於此時不需要此映射,因此您希望執行的映射與大多數設備不兼容,因爲eszett不是標準英文鍵盤的組成部分,因此不應該支持它,除了其中一個原始設備製造商實際上已經在他們自己的鍵盤實現中包含對此的支持(請記住,Google不實施這一點,OEM必須這樣做)。

+0

在我的特殊情況下,我是'OEM'。雖然沒有涉及物理設備,但我爲虛擬設備編寫了驅動程序。我確實提供了設備的關鍵字符映射(kcm文件),但它沒有做它應該做的事情。我可能錯過了一些東西。 –

+0

我看到,我不認爲我可以幫助這個人,因爲我在hal層工作(如OEM),但現在您告訴我這一點,問題可能與駕駛員有關。您是否檢查過您正在使用的「虛擬物理接口」未被其他驅動程序使用?可能是一個很長的鏡頭,但我現在在android中的幾個驅動程序是多路複用的,但有時由於它們互相干擾的錯誤。無論如何,我已經看到這在android發生了很多。但缺乏這方面的經驗來幫助你。我希望你在這個問題上運氣並取得成功。 – Jorch914

相關問題