2013-02-21 1 views
2

La situation est la suivante:Injecter des accents événements KEY dans android

J'envoie des événements à distance à mes appareils (j'ai totalement accès). Ces événements sont des événements clés, donc je les injecte directement à/dev/input/event *

Je fais un clavier, j'ai réussi à envoyer des touches normales AZ, 0-9, des caractères spéciaux comme *^'? ...

Mais maintenant je veux injecter des caractères comme ceci à J'ai essayé beaucoup de choses mais ne fonctionne pas.

Une idée comment puis-je injecter cela directement dans le fichier d'événements Linux?

J'ai essayé par exemple d'injecter KEY_GRAVE puis KEY_A mais je reçois `un

Répondre

2

Pour qui cette difficulté avec le même problème, je résous enfin. J'ai trouvé la lecture du keycharmap à l'intérieur de /system/usr/keychars/Virtual.km

J'ai trouvé que certaines lettres sont définies avec des Unicodes que les Unicodes sont les symboles d'accents et ainsi de suite.

Ainsi je crée une classe pour identifier ces codes et d'un char je reçois le code de 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; 
} 

vous devez appeler convertCharToCode (c) avec le charbon que vous obtenez du texte, puis aussi vous devez appeler needShift (char c) pour vérifier si le décalage de besoin. Aussi avant d'envoyer l'événement je vérifie si la lettre est un deadchar comme à á ä ... s'il y a j'injecte le KEY_RIGHTALT avec la lettre correspondante.

Par exemple, si vous avez besoin d'injecter à la séquence doit être:

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); 

Ces intSendEvent sont des fonctions natives pour injecter des événements.

Questions connexes