2012-05-25 16 views
7

Sto programmando su un'app di controllo remoto. Uno dei compiti è l'iniezione di caratteri. Il codice Attualmente sto usando assomiglia a questo:Iniezione di caratteri non inglesi su 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); 
    } 
} 

che funziona perfettamente su caratteri inglesi (I caratteri visualizzati in scatole EditText). Tuttavia, se sto cercando di iniettare per es. Caratteri coreani, questo fallisce. La funzione getEvents restituisce null, anche se ho configurato la lingua e la tastiera coreane.

So che c'è un altro metodo per iniettare direttamente le stringhe:

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

Questo non funziona neanche - non nell'immagine qui in scatole EditText, e onKeyMultiple() non è chiamato né nella mia attività di prova.

Questo è strano dato dispatchKeyEvent() con lo stesso evento opera nella mia attività di test:

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

mia app telecomando ha bisogno di iniettare eventi non importa a quale attività. Questo è possibile usando la strumentazione (con android.permission.INJECT_EVENTS e una firma con la chiave della piattaforma).

Come posso inserire caratteri non inglesi utilizzando la strumentazione? C'è un altro modo per realizzare questo? Per esempio. Usando dispatchKeyEvent (deve funzionare anche per altre attività/app).

+0

sto avendo lo stesso problema al momento. Qualche idea a qualcuno? – Sprigg

+0

partendo dal presupposto che 'm_KeyCharacterMap' sia effettivamente' keyCharacterMap'? –

+0

hai ragione. Ho corretto il codice. – kahlk

risposta

-2

È possibile utilizzare questo metodo e InputFilter per EditText:

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

Ci dispiace, ma la tua risposta non ha nulla a che fare con la domanda posta. – Sprigg

+0

So che è stato il mio errore espellere invece di iniettare. –

2

lascio la parte sopra informazioni come extra. Ho trovato una soluzione. Richiede di avere root, ma se riesci a firmare con la chiave dell'applicazione, immagino che non sia un problema. Quello che puoi fare è modificare il file Virtual.kcm (/system/usr/keychars/Virtual.kcm), che è la mappa dei caratteri chiave di default (kcm). È possibile aggiungere qualsiasi carattere desiderato e quindi utilizzare il metodo Instrumentation.sendStringSync (stringa stringa), poiché sarà in grado di generare KeyEvents dal nuovo kcm.

Ho avuto qualche problema a modificare il kcm sul telefono, quindi quello che ho fatto è stato copiarlo su un computer, modificarlo e quindi copiarlo sul dispositivo.

Spero che questo aiuti!


In questo link, viene visualizzato il seguente contenuto. Sembra che la tastiera virtuale abbia un keyCharacterMap e un layout statunitensi, indipendentemente dalle impostazioni selezionate. Non sono stato in grado di trovare un modo per risolvere questo.

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. 
Problemi correlati