2012-05-25 55 views
7

我正在编写一个远程控制应用程序。其中一项任务是注入字符。我目前使用的代码如下所示:在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); 
    } 
} 

对英文字符(字符显示在EditText框中)完美起作用。但是,如果我尝试注入例如韩文字符,这失败了。即使我配置了韩语和键盘,getEvents函数也会返回null。

我知道有直接注入串的另一种方法:

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

这不是工作要么 - 没有在EditText上框中显示的字符,onKeyMultiple()不叫无论是在我的测试活动。

这是奇怪的,因为dispatchKeyEvent()使用相同的事件工作在我的测试活动:

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

我的遥控器的应用程序需要注入事件,无论哪个活动。这可以使用Instrumentation(使用android.permission.INJECT_EVENTS和带有平台密钥的签名)。

如何使用仪器注入非英文字符? 有没有另外一种方法来完成这个?例如。使用dispatchKeyEvent(也必须适用于其他活动/应用程序)。

+0

我现在有同样的问题。任何想法的人?假设'm_KeyCharacterMap'实际上是'keyCharacterMap'? – Sprigg

+0

? –

+0

你是对的。我更正了代码。 – kahlk

回答

-2

您可以使用此方法,并输入过滤器的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

对不起,但你的回答与被问的问题无关。 – Sprigg

+0

我知道这是我的错误弹出而不是注射。 –

2

我离开上面额外的信息的一部分。我找到了一个解决方案。它需要拥有root权限,但是如果您可以使用应用程序密钥进行签名,我想这不是问题。你可以做的是编辑文件Virtual.kcm(/system/usr/keychars/Virtual.kcm),这是默认的关键字符映射(kcm)。你可以添加你想要的任何字符,然后使用Instrumentation.sendStringSync(String string)方法,因为它可以从新的kcm生成KeyEvent。

我在编辑手机上的kcm时遇到了一些问题,所以我做的是将它复制到计算机上,在那里编辑它,然后将其复制回设备。

我希望这有助于!


在此link中,出现以下内容。无论您在设置上选择什么,它都会接触到虚拟键盘具有美国keyCharacterMap和布局。我一直无法找到解决这个问题的方法。

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.