Как отправить KeyEvents через сервис метода ввода в диалог или в меню Spinner? - PullRequest
5 голосов
/ 11 апреля 2010

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

Я использую в input method service этот метод

private void keyDownUp(int keyEventCode) 
{
    getCurrentInputConnection().sendKeyEvent(
              new KeyEvent(KeyEvent.ACTION_DOWN, keyEventCode));
    getCurrentInputConnection().sendKeyEvent(
              new KeyEvent(KeyEvent.ACTION_UP, keyEventCode));
}

для отправки KeyEvents как в Simple Sofykeyboard Sample, и он работает дома, в Activities. .. но не работает, когда диалог или меню Spinner находятся на переднем плане.

События отправляются на parent activity behind the Dialog.

Есть ли способ отправки ключей и управления устройством, например, использование аппаратных клавиш из метода ввода?

Лучшее объяснение того, что я пытаюсь сделать:

Я вроде пишу метод ввода, который позволяет управлять устройством с пульта.

Я пишу в клиенте (Java-приложение на моем настольном компьютере) команду (например, «UP»), сервер на устройстве с sendBroadcast() отправляет намерение с информацией и получатель в методе ввода получает его и вызывает keyDownUp с keycode из DPAD_UP key. Обычно это работает, но когда я захожу в приложение, которое показывает диалоговое окно, метод keyDownUp не отправляет событие key в dialog, например, для выбора кнопок «да» или «нет», но сохраняет управление activty за Dialog.

Здесь Я нашел кого-то с той же проблемой ... но ответа нет ...

1 Ответ

1 голос
/ 11 апреля 2010

Сначала позвольте мне объяснить, что я понял.

  • Вы идете в приложение
  • Вы открываете диалог в этом упражнении (например, зайдите в приложение sms, долго нажмите на ветку)
  • Вы нажимаете клавишу HOME.
  • Перейти к другому приложению, которое отправляет намерение
  • IME получает намерение и записывает что-то.

Я не понимаю, как снова открывается действие с Диалогом.

AFAIK, когда вы нажимаете клавишу на soft-клавиатуре, вызывается IME onKey(int primaryCode, int[] keyCodes), а когда вы нажимаете жесткую клавишу, IME вызывается по адресу:

  • public boolean onKeyUp(int keyCode, KeyEvent event)
  • public boolean onKeyDown(int keyCode, KeyEvent event)

Вместо этого вы можете попробовать вызвать эти методы, но я не знаю, исправит ли это эмуляция жесткого ключа. Я предполагаю, что это проблема фокуса. Вы пытались получить текст из getCurrentInputConnection(), чтобы увидеть, где он стоит?

...