2013-02-21 34 views
2

情況如下:在Android中注入重音KEY事件

我發送遠程事件給我的設備(我完全訪問它)。這個事件是KEY事件,所以我直接將它們注入到/ dev/input/event *

我正在做一個鍵盤,我發送普通按鍵AZ,0-9,一些特殊字符如* ^, '?...

但現在我想注入像這樣的字符我嘗試了很多東西,但不起作用。

任何想法如何將這個直接注入到linux事件文件?

我試圖例如注入KEY_GRAVE然後KEY_A但我得到`一個

回答

2

對於誰是困擾着同樣的問題,我終於解決了。我發現讀取/system/usr/keychars/Virtual.km裏面的keycharmap

我發現一些字母是用unicodes定義的,這個uncodes是重音符號等等。

因此,我創建一個類來識別這些代碼,並從一個字符我得到的Linux代碼。

public static int convertCharToCode(char c) { 
    switch (c) { 
    case 'a': return Codes.KEY_A; 
    case 'b': return Codes.KEY_B; 
    case 'c': return Codes.KEY_C; 
    case 'd': return Codes.KEY_D; 
    case 'e': return Codes.KEY_E; 
    case 'f': return Codes.KEY_F; 
    case 'g': return Codes.KEY_G; 
    case 'h': return Codes.KEY_H; 
    case 'i': return Codes.KEY_I; 
    case 'j': return Codes.KEY_J; 
    case 'k': return Codes.KEY_K; 
    case 'l': return Codes.KEY_L; 
    case 'm': return Codes.KEY_M; 
    case 'n': return Codes.KEY_N; 
    case 'o': return Codes.KEY_O; 
    case 'p': return Codes.KEY_P; 
    case 'q': return Codes.KEY_Q; 
    case 'r': return Codes.KEY_R; 
    case 's': return Codes.KEY_S; 
    case 't': return Codes.KEY_T; 
    case 'u': return Codes.KEY_U; 
    case 'v': return Codes.KEY_V; 
    case 'w': return Codes.KEY_W; 
    case 'x': return Codes.KEY_X; 
    case 'y': return Codes.KEY_Y; 
    case 'z': return Codes.KEY_Z; 
    case '0': return Codes.KEY_0; 
    case '1': return Codes.KEY_1; 
    case '2': return Codes.KEY_2; 
    case '3': return Codes.KEY_3; 
    case '4': return Codes.KEY_4; 
    case '5': return Codes.KEY_5; 
    case '6': return Codes.KEY_6; 
    case '7': return Codes.KEY_7; 
    case '8': return Codes.KEY_8; 
    case '9': return Codes.KEY_9; 
    case '-': return Codes.KEY_MINUS; 
    case '=': return Codes.KEY_EQUAL; 
    case ';': return Codes.KEY_SEMICOLON; 
    case ' ': return Codes.KEY_SPACE; 
    case '\'': return Codes.KEY_APOSTROPHE; 
    case '`': return Codes.KEY_GRAVE; 
    case '\\': return Codes.KEY_BACKSLASH; 
    case ',': return Codes.KEY_COMMA; 
    case '.': return Codes.KEY_DOT; 
    case '/': return Codes.KEY_SLASH; 
    case '!': return Codes.KEY_1; 
    case '@': return Codes.KEY_2; 
    case '#': return Codes.KEY_3; 
    case '$': return Codes.KEY_4; 
    case '%': return Codes.KEY_5; 
    case '^': return Codes.KEY_6; 
    case '&': return Codes.KEY_7; 
    case '*': return Codes.KEY_8; 
    case '(': return Codes.KEY_9; 
    case ')': return Codes.KEY_0; 
    case '_': return Codes.KEY_MINUS; 
    case '+': return Codes.KEY_EQUAL; 
    case ':': return Codes.KEY_SEMICOLON; 
    case '\"': return Codes.KEY_APOSTROPHE; 
    case '~': return Codes.KEY_GRAVE; 
    case '|': return Codes.KEY_BACKSLASH; 
    case '<': return Codes.KEY_COMMA; 
    case '>': return Codes.KEY_DOT; 
    case '?': return Codes.KEY_SLASH; 
    default: 
     return -1; 
    } 
} 

public static boolean needShift(char c) { 
    switch (c) { 
    case '!': 
     return true; 
    case '@': 
     return true; 
    case '#': 
     return true; 
    case '$': 
     return true; 
    case '%': 
     return true; 
    case '^': 
     return true; 
    case '&': 
     return true; 
    case '*': 
     return true; 
    case '(': 
     return true; 
    case ')': 
     return true; 
    case '_': 
     return true; 
    case '+': 
     return true; 
    case ':': 
     return true; 
    case '\"': 
     return true; 
    case '~': 
     return true; 
    case '|': 
     return true; 
    case '<': 
     return true; 
    case '>': 
     return true; 
    case '?': 
     return true; 
    } 
    return false; 
} 

你應該叫convertCharToCode(c)與您從文本獲得字符,那麼你也應該調用needShift(字符C)來檢查是否需要轉變。在發送活動之前,我還會檢查這封信是否是像這樣的死鎖,如果有我注入KEY_RIGHTALT和對應的字母,那麼...

例如,如果你需要注入à順序必須是:

intSendEvent(Codes.EV_KEY, Codes.KEY_RIGHTALT, 1); 
intSendEvent(Codes.EV_KEY, Codes.KEY_GRAVE, 1); 
intSendEvent(Codes.EV_KEY, Codes.KEY_GRAVE, 0); 
intSendEvent(Codes.EV_KEY, Codes.KEY_RIGHTALT, 0); 

if (caps==1) 
    result=intSendEvent(Codes.EV_KEY, Codes.KEY_LEFTSHIFT, 1); 
sendSpecialChar(special); 

result=intSendEvent(Codes.EV_KEY, key, 1); 
result=intSendEvent(Codes.EV_KEY, key, 0); 
if (caps==1) 
    result=intSendEvent(Codes.EV_KEY, Codes.KEY_LEFTSHIFT, 0); 
intSendEvent(Codes.EV_SYN, 0, 0); 

這些intSendEvent是本地函數注入事件。