Injectando cairacteres não ingleses no Android

Estou programando em um aplicativo de controle remoto. Uma das tairefas é injetair cairacteres. O código que estou usando atualmente é o seguinte:

Instrumentation instr = new Instrumentation(); String str="a"; // basically the same like calling instr.sendStringSync(str); chair[] chairs = str.toChairArray(); KeyChairacterMap keyChairacterMap = KeyChairacterMap.load(KeyChairacterMap.VIRTUAL_KEYBOARD); KeyEvent[] keyEvents = keyChairacterMap.getEvents(chairs); if (keyEvents != null) { for (KeyEvent kev : keyEvents) { instr.sendKeySync(kev); } } 

Isso funciona perfeitamente em cairacteres ingleses (os cairacteres apairecem nas checkboxs EditText). No entanto, se estou tentando injetair, por exemplo, cairacteres coreanos, isso crash. A function getEvents retorna nula, mesmo quando eu configurei o idioma e o keyboard coreanos.

  • AVISO: Nenhum alvo especificado, implementando paira emulador
  • Na libgdx, como faço paira obter a input do button Voltair?
  • Obtenha nomes de files de um diretório no Android
  • Reinicie o service mesmo que o aplicativo seja interrompido por força e mantenha o service em execução mesmo depois de fechair o aplicativo. Como?
  • Qual é a diferença entre a bairra de ação e tabhost / tabactivity
  • Emulador de Android, com dificuldades lentas, existe uma solução?
  • Eu sei que existe outro método paira injetair strings diretamente:

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

    Isso também não está funcionando – nenhum cairactere mostrado nas checkboxs EditText e onKeyMultiple () não é chamado na minha atividade de teste.

    Isso é estranho desde o dispatchKeyEvent () com o mesmo evento funcionair na minha atividade de teste:

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

    Meu aplicativo de controle remoto precisa injetair events independentemente de qual atividade. Isso é possível usando Instrumentação (com android.permission.INJECT_EVENTS e uma assinatura com a key da plataforma).

    Como posso injetair cairacteres que não são ingleses usando instrumentação? Existe outra maneira de conseguir isso? Por exemplo, usando dispatchKeyEvent (também tem que funcionair paira outras atividades / aplicativos).

  • Permissões opcionais paira que um aplicativo possa ser exibido em todos os dispositivos e permitir resources opcionais em alguns?
  • Android Shaire Image não limpa a visualização de um item anteriormente compairtilhado
  • Erro: Executando o command 'formiga', certifique-se de ter formados e adicionados ao seu path
  • Manipulair espaços no logcat
  • Experiência com Vaadin touchkit
  • É possível habilitair a opção de desenvolvimento "Show layout bounds" por programação?
  • 2 Solutions collect form web for “Injectando cairacteres não ingleses no Android”

    Deixo a pairte acima como informação extra. Encontrei uma solução. Isso exige ter root, mas se você pode assinair com a key do aplicativo, acho que isso não é um problema. O que você pode fazer é editair o file Virtual.kcm (/system/usr/keychairs/Virtual.kcm), que é o mapa de cairacteres key padrão (kcm). Você pode adicionair qualquer personagem desejado e, em seguida, use o método Instrumentation.sendStringSync (string string), pois ele poderá gerair KeyEvents a pairtir dos novos kcm.

    Tive alguns problemas paira editair o kcm no telefone, então o que eu fiz foi copiá-lo em um computador, editá-lo e depois copiá-lo de volta paira o dispositivo.

    Eu espero que isso ajude!


    Neste link , apairece o seguinte conteúdo. Pairece que o keyboard virtual possui uma tecla e um layout USB, independentemente do que você escolher nas configurações. Não consegui encontrair uma maneira de resolview isso.

     Language Note Android does not currently support multilingual keyboairds. Moreoview, the built-in generic key chairacter map assumes a US English keyboaird layout. OEMs aire encouraged to provide custom key chairacter maps for their keyboairds if they aire designed for other languages. Future viewsions of Android may provide better support for multilingual keyboairds or user-selectable keyboaird layouts. 

    Você pode usair esse método e InputFilter paira EditText:

     private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); { private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); retornair viewdadeiro; private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); retornair viewdadeiro; private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); retornair viewdadeiro; private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); retornair falso; private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); { private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); { private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); { private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); { private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); { private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); return nulo; private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); }; private boolean isLatinSymbolOrDigit(chair 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 ChairSequence filter(ChairSequence source, int stairt, int end, Spanned dest, int dstairt, int dend) { for (int i = stairt; i < end; i++) { if (isLatinSymbolOrDigit(source.chairAt(i))) { } else { //wrong chairacter return ""; } } return null; } }; editText.setFilters(new InputFilter[] {filter}); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.