5

Próbuję zaimplementować usługę metody wprowadzania, która odbiera intencje wysyłane przez klienta zdalnego, aw odpowiedzi na te wysyła odpowiedni KeyEvent.Jak wysłać KeyEvents poprzez usługę metody wprowadzania do okna dialogowego lub menu pokrętła?

używam w input method service tej metody

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

wysłać KeyEvents jak w Simple Sofykeyboard Sample, a ona pracuje w domu, w Activities. .. ale to nie działa, gdy Dialog lub menu Prządki jest na pierwszym planie.

Zdarzenia wysyłane są na numer parent activity behind the Dialog.

Czy istnieje sposób przesyłania kluczy i sterowania urządzeniem, np. Za pomocą klawiszy sprzętowych metody wprowadzania?

lepsze wyjaśnienie tego, co próbuję zrobić:

ja niby writng metodę wprowadzania, który pozwala sterować urządzeniem z pilota.

Piszę w kliencie (aplikacja Java na moim komputerze stacjonarnym) polecenie (na przykład "UP"), serwer na urządzeniu z sendBroadcast() wysyła intencję z informacją, a odbiornik w metodzie wprowadzania pobiera i wywołuje keyDownUp z keycode z DPAD_UP key. Zasadniczo działa, ale kiedy idę do aplikacji, która pokazuje okno dialogowe, metoda keyDownUp nie wysyła kluczowego zdarzenia do dialog, na przykład aby wybrać tak lub nie przyciski, ale nadal kontroluje activty za Dialog.

Here znalazłem kogoś z mojego sam problem ... ale nie ma odpowiedzi ...

Odpowiedz

1

Po pierwsze, pozwól mi wyjaśnić, co ja rozumiem.

  • Idziesz do aplikacji
  • otwarciu Dialog w tej działalności (na przykład przejść do SMS aplikacji, naciśnij długo wątku)
  • nacisnąć klawisz HOME.
  • Przejdź do innej aplikacji, która wysyła intencję.
  • Edytor IME uzyskuje intencję i zapisuje coś.

Nie rozumiem, jak ponownie otwiera się działanie z oknem dialogowym.

AFAIK, po naciśnięciu klawisza w softKeyboard, IME na onKey(int primaryCode, int[] keyCodes) nazywa i po naciśnięciu dysk klucza do IME nazywa się:

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

Ty może spróbować wywoływać te metody, ale nie wiem, czy naprawiłby to emulowanie klucza twardego. Myślę, że to kwestia ostrości. Czy próbowałeś uzyskać tekst z getCurrentInputConnection(), aby zobaczyć, gdzie stoi?

+0

Zmieniłem moje pytanie, próbując wyjaśnić, jaki jest mój problem. W twoim przykładzie po otwarciu okna dialogowego w aplikacji sms, jeśli wyślę polecenie DOWN dla klucza DPAD_DOWN, nie spowoduje to przewinięcia okna na pierwszym planie, ale zostanie wysłane do działania za nim, które pokazuje listę wiadomości, wybierając wiadomość pod tą, którą długo naciskałem, uniemożliwiając zamknięcie okna. Próbowałem zadzwonić naKeyDown i onKeyUp, ale nie działają one ani tam, gdzie działało keyDownUp. – shutdown11

+0

Funkcja getCurrentInputConnection() zawsze zwraca połączenie z działaniem, które pokazuje dialog, a nigdy z dialogiem. Używając twardych klawiszy, możesz przewijać okno dialogowe, gdy jest ono skupione, więc zastanawiałem się, jak emulować twardy klucz. – shutdown11

+0

Twardy klucz można z pewnością symulować za pomocą klasy Instrumentation, ale wymaga on zrootowanego urządzenia. –

Powiązane problemy