在Android中注入非英文字符

kah*_*hlk 7 events android code-injection

我在远程控制应用程序上编程.其中一项任务是注入角色.我目前使用的代码如下所示:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), str, 0, 0);
instr.sendKeySync(event);
Run Code Online (Sandbox Code Playgroud)

这也不起作用 - 在EditText框中没有显示任何字符,并且在我的测试活动中也没有调用onKeyMultiple().

这很奇怪,因为具有相同事件的dispatchKeyEvent()在我的测试活动中起作用:

KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), str, 0, 0);
dispatchKeyEvent(event);
Run Code Online (Sandbox Code Playgroud)

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

如何使用仪器注入非英文字符?还有另一种方法来实现这一目标吗?例如,使用dispatchKeyEvent(也必须适用于其他活动/应用程序).

Art*_*iyk -2

您可以将此方法和 InputFilter 用于 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});
Run Code Online (Sandbox Code Playgroud)