Экранная клавиатура на Android не отправляет правильные коды клавиш для второго языка

У меня есть приложение с NativeActivity.

Я хочу показать экранную клавиатуру и прослушать нажатия клавиш. Все работает нормально, когда я печатаю на английском языке, но когда я переключаю клавиатуру на русский, я получаю только нули для кода клавиши, метастата и т. д.

Чтобы показать клавиатуру, я использую этот код:

InputMethodManager imm = (InputMethodManager) activity.getSystemService( Context.INPUT_METHOD_SERVICE );
View view = activity.getWindow( ).getDecorView( );
imm.showSoftInput( view, 0 );

Я получаю события клавиатуры в функции onInputEvent в NativeActivity:

int32_t eventType = AInputEvent_getType( event );
if( eventType == AINPUT_EVENT_TYPE_KEY )
{
    int32_t keyAction = AKeyEvent_getAction( event );
    int32_t keyCode = AKeyEvent_getKeyCode( event );
    int32_t repeatCount = AKeyEvent_getRepeatCount( event );
    int32_t keyFlags = AKeyEvent_getFlags( event );
    int32_t keyScanCode = AKeyEvent_getScanCode( event );
    int32_t keyMetaState = AKeyEvent_getMetaState( event );

    LOGW( "EventType = AINPUT_EVENT_TYPE_KEY, keyAction = %d, keyCode = %d, repeatCount = %d, keyFlags = %d, keyScan = %d, keyMeta = %d", keyAction, keyCode, repeatCount, keyFlags, keyScanCode, keyMetaState );
}

И я получаю все параметры события как нули.

Как я могу это решить?


person Dmitrii Tokarev    schedule 22.04.2014    source источник


Ответы (2)


В документации KeyEvent говорится:

Поскольку программные методы ввода могут использовать несколько изобретательных способов ввода текста, нет гарантии, что любое нажатие клавиши на программной клавиатуре вызовет событие клавиши: это остается на усмотрение IME, и на самом деле отправка таких событий не рекомендуется. Вы никогда не должны полагаться на получение KeyEvents для любой клавиши в методе мягкого ввода. В частности, программная клавиатура по умолчанию никогда не будет отправлять какие-либо события клавиш любому приложению, предназначенному для Jelly Bean или более поздней версии, и будет отправлять события только для некоторых нажатий клавиш удаления и возврата приложениям, предназначенным для Ice Cream Sandwich или более ранней версии.

person Murtaza Khursheed Hussain    schedule 16.03.2015
comment
Означает ли это, что я могу отображать программную клавиатуру, но не могу слушать ее ключевые события? - person Nick; 16.03.2015
comment
нет 100% гарантии, что вы получите коды ключей. - person Murtaza Khursheed Hussain; 16.03.2015
comment
Спасибо за ваши комментарии, но я не спрашиваю, как мне получить коды ключей. Я спрашиваю, как мне слушать программную клавиатуру из NativeActivity. Если я не могу полагаться на KeyEvents или KeyCodes или что-то еще, что мне делать, чтобы перехватывать щелчки клавиатуры? - person Nick; 16.03.2015
comment
Что вы имели в виду под NativeActivity? - person Murtaza Khursheed Hussain; 16.03.2015
comment
Тебя плохо видно. Я вижу, вы не являетесь автором этого вопроса. Если у вас есть какие-либо проблемы, опубликуйте или задайте свой вопрос, мой ответ предназначен для автора этого вопроса. - person Murtaza Khursheed Hussain; 16.03.2015
comment
Самая первая строка вопроса автора гласит: у меня есть приложение с NativeActivity. - person Nick; 16.03.2015
comment
и он объяснил, что получает keycodes, но в zeros - person Murtaza Khursheed Hussain; 16.03.2015
comment
И его вопрос: как я могу это решить? т.е. как прослушать нажатия клавиш? - person Nick; 16.03.2015
comment
Он хочет знать, почему он получает нули, вот что я ответил. - person Murtaza Khursheed Hussain; 16.03.2015

Это ответ (ключ должен переопределить dispatchKeyEvent): https://stackoverflow.com/a/43871301/674548

person Nick    schedule 07.07.2017