2012-05-25 17 views
7

Estoy programando en una aplicación de control remoto. Una de las tareas es inyectar personajes. El código que estoy usando actualmente tiene este aspecto:Inyectar caracteres no ingleses en Android

Instrumentation instr = new Instrumentation(); 

String str="a"; 

// basically the same like calling instr.sendStringSync(str); 
char[] chars = str.toCharArray(); 
KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); 
KeyEvent[] keyEvents = keyCharacterMap.getEvents(chars); 
if (keyEvents != null) { 
    for (KeyEvent kev : keyEvents) { 
     instr.sendKeySync(kev); 
    } 
} 

que funciona perfectamente en caracteres ingleses (Los caracteres aparecen en cajas EditText). Sin embargo, si intento inyectar, p. Caracteres coreanos, esto falla. La función getEvents devuelve null, incluso cuando configuré el teclado y el idioma coreano.

sé que no es otro método para inyectar directamente cuerdas:

KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), str, 0, 0); 
instr.sendKeySync(event); 

Esto no está funcionando bien - no hay caracteres que se muestran en cajas EditText, y onKeyMultiple() no se llama ya sea en mi actividad de prueba.

Esto es extraño, ya que dispatchKeyEvent() con el mismo evento funciona en mi actividad de prueba:

KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), str, 0, 0); 
dispatchKeyEvent(event); 

Mi aplicación de control remoto necesita para inyectar eventos no importa a qué actividad. Esto es posible usando Instrumentation (con android.permission.INJECT_EVENTS y una firma con la clave de la plataforma).

¿Cómo puedo inyectar caracteres no ingleses usando instrumentación? ¿Hay alguna otra manera de lograr esto? P.ej. Usando dispatchKeyEvent (tiene que funcionar para otras actividades/aplicaciones también).

+0

tengo el mismo problema por el momento. ¿Alguna idea a alguien? – Sprigg

+0

suponiendo que 'm_KeyCharacterMap' es en realidad' keyCharacterMap'? –

+0

tienes razón. Corregí el código. – kahlk

Respuesta

-2

Puede utilizar este método y InputFilter para EditarTexto:

private boolean isLatinSymbolOrDigit(char c) 
{ 
    // Allow [a-zA-Z0-9] 
    if ('0' <= c && c <= '9') 
     return true; 
    if ('a' <= c && c <= 'z') 
     return true; 
    if ('A' <= c && c <= 'Z') 
     return true; 
    return false; 
} 

InputFilter filter = new InputFilter() 
{ 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
    { 
     for (int i = start; i < end; i++) 
     { 
      if (isLatinSymbolOrDigit(source.charAt(i))) 
      { 
      }     
      else 
      { 
       //wrong character 
       return ""; 
      } 
     } 
     return null; 
    } 
}; 

editText.setFilters(new InputFilter[] {filter}); 
+0

Lo sentimos, pero su respuesta no tiene nada que ver con la pregunta formulada. – Sprigg

+0

Sé que fue mi error expulsar en lugar de inyectar. –

2

dejo la parte de arriba como información adicional. He encontrado una solución. Requiere tener root, pero si puede firmar con la clave de la aplicación, supongo que eso no es un problema. Lo que puede hacer es editar el archivo Virtual.kcm (/system/usr/keychars/Virtual.kcm), que es el mapa de caracteres clave predeterminado (kcm). Puede agregar cualquier carácter que desee y luego usar el método Instrumentation.sendStringSync (String string), ya que podrá generar KeyEvents desde el nuevo kcm.

Tuve algunos problemas al editar el kcm en el teléfono, entonces lo que hice fue copiarlo en una computadora, editarlo allí y luego copiarlo de nuevo al dispositivo.

Espero que esto ayude!


En este link, aparece el siguiente contenido. Parece que el teclado virtual tiene un keyCharacterMap y un diseño de US key, independientemente de lo que elija en la configuración. No he podido encontrar una manera de resolver esto.

Language Note 

Android does not currently support multilingual keyboards. Moreover, the built-in generic key character map assumes a US English keyboard layout. 

OEMs are encouraged to provide custom key character maps for their keyboards if they are designed for other languages. 

Future versions of Android may provide better support for multilingual keyboards or user-selectable keyboard layouts. 
Cuestiones relacionadas