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 ...
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
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
Clave de hardware seguramente se puede simular con la clase de Instrumentación, pero requiere dispositivo rooteado. –