Внедрение неанглийских символов в 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 (необходимо работать и для других видов деятельности / приложений).

Я оставляю эту часть выше как дополнительную информацию. Я нашел решение. Для этого требуется иметь root, но если вы можете подписать ключ приложения, я думаю, это не проблема. Что вы можете сделать, это отредактировать файл Virtual.kcm (/system/usr/keychars/Virtual.kcm), который представляет собой карту символов ключа по умолчанию (kcm). Вы можете добавить любой символ, который хотите, а затем использовать метод Instrumentation.sendStringSync (строка строки), потому что он сможет генерировать KeyEvents из нового kcm.

У меня были проблемы с редактированием kcm на телефоне, так что я сделал это, чтобы скопировать его на компьютер, отредактировать его, а затем скопировать обратно на устройство.

Надеюсь, это поможет!


В этой ссылке появляется следующий контент. Это означает, что виртуальная клавиатура имеет US 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. 

Вы можете использовать этот метод и 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});