5

Estoy intentando implementar un servicio de método de entrada que recibe los intentos enviados por un cliente remoto, y en respuesta a esos envía un KeyEvent apropiado.¿Cómo enviar KeyEvents a través de un servicio de método de entrada a un cuadro de diálogo o un menú de Spinner?

estoy usando en el input method service este método

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

para enviar KeyEvents como en el Simple Sofykeyboard Sample, y funciona en el hogar, en Activities. .. pero no lo hace trabajos cuando un cuadro de diálogo o el menú de un Spinner está en primer plano.

Los eventos se envían al parent activity behind the Dialog.

¿Hay alguna forma de enviar las llaves y controlar el dispositivo como si se usaran las teclas de hardware de un método de entrada?

mejor explicación de lo que estoy tratando de hacer:

Soy un poco Writng un método de entrada que permite controlar el dispositivo de forma remota.

Escribo en un cliente (una aplicación java en mi PC de escritorio) un comando (por ejemplo "ARRIBA"), un servidor en el dispositivo con sendBroadcast() envía el intento con la información, y un receptor en el método de entrada lo consigue y llama a KeyDownUp con el keycode del DPAD_UP key. Generalmente funciona, pero cuando voy a una aplicación que muestra un diálogo, el método keyDownUp no envía el evento clave al dialog, por ejemplo para seleccionar el sí o el no botones, pero mantiene el control activty detrás de Dialog.

Here he encontrado a alguien con mi mismo problema ... pero no hubo respuesta ...

Respuesta

1

En primer lugar, permítanme explicar lo que entendía.

  • vas a una aplicación
  • Se abre un diálogo en el que la actividad (por ejemplo ir a la aplicación SMS, pulse durante mucho tiempo un hilo)
  • pulsa la tecla INICIO.
  • Ir a una aplicación diferente que envía la intención
  • El IME obtiene la intención y anota algo.

No entiendo cómo se vuelve a abrir la actividad con el Diálogo.

yo sepa, cuando se pulsa una tecla en el softKeyboard, se llama del IME onKey(int primaryCode, int[] keyCodes) y cuando se presiona una tecla dura el IME se llama al:

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

Usted puede intentar llamar a esos métodos en su lugar, pero no sé si la emulación de una clave difícil lo solucionaría. Supongo que es un problema de enfoque. ¿Has intentado obtener el texto de getCurrentInputConnection() para ver dónde está parado?

+0

He editado mi pregunta tratando de aclarar cuál es mi problema. En su ejemplo, cuando abro el cuadro de diálogo en la aplicación sms, si envío el comando DOWN para la tecla DPAD_DOWN, no hace que el cuadro de diálogo en primer plano se desplace, sino que se envía a la actividad que está detrás, la que muestra la lista de mensajes, seleccionando el mensaje debajo del que presioné por mucho tiempo, haciendo imposible cerrar el diálogo. Intenté llamar aKeyDown y onKeyUp, pero no funcionan ni en el lugar donde funcionó keyDownUp. – shutdown11

+0

getCurrentInputConnection() siempre devuelve una conexión con la actividad que muestra el diálogo, y nunca el diálogo. Usando teclas duras en su lugar, puede desplazar el diálogo cuando está enfocado, por lo que me preguntaba cómo emular una tecla. – shutdown11

+0

Clave de hardware seguramente se puede simular con la clase de Instrumentación, pero requiere dispositivo rooteado. –

Cuestiones relacionadas