Manejo de llaves de Android (Framework)

Hay algunas partes del marco que todavía no me son claras. Soy bien conocido con el flujo de un evento de entrada (Kernel -> Eventhub -> InputReader -> InputDispatcher -> …).

Situación

(Requisitos: manejar las teclas de entrada sin cambiar el Android Framework.) Quiero manejar los eventos clave que vienen de un dispositivo (teclado / gamepad / controlador / …) pero hay algunos requisitos. Por un lado, no quiero cambiar el marco de Android. Esto significa que no quiero extender el WindowManagerPolicy y sus funciones como interceptKeyBeforeDispatching donde se está manejando la clave de inicio. Esto daría lugar a que el evento clave se envíe a la capa de aplicación que está bien. La desventaja es, tengo otro requisito complicado aquí. Ejemplo: Cuando estoy jugando Angry Birds y presiono mi botón GoToAlpha en mi dispositivo de entrada conectado, la aplicación Alpha tiene que empezar. Angry Birds no tiene idea de cual botón GoToAlpha es, no lo manejará / lo reconocerá y no habrá por ejemplo ninguna intención emitida para iniciar mi aplicación Alpha.

Pregunta

¿Hay una manera de manejar mi evento de clave (personalizado) después de que se está despachando, sabiendo que la aplicación en primer plano no puede manejar la clave?

Mis soluciones (fallidas)

  • Cree un servicio que maneje los eventos clave. Esto no es posible porque una aplicación como Angry Birds no se vinculará a mi servicio y el evento clave no será capturado dentro de mi servicio. Si estoy equivocado, por favor proporcione más información :).

  • Cree una biblioteca externa donde permito que las actividades de mi aplicación hereden de mi propia ActivityBase. Todos los eventos clave y su comportamiento por defecto se pueden manejar aquí. Lo malo, las aplicaciones existentes no soportarán mis eventos de clave personalizados porque no utilizan la biblioteca.

  • Ampliar el marco sería en mis ojos la solución más limpia, pero que dará lugar a no cumplir con mi requisito.

Cualquier ayuda o información útil sería apreciada

Extra

Si la primera pregunta pudiera ser resuelta de una forma u otra .. Quiero personalizar mi Intent detrás del botón GoToAlpha. Esto significa que .. Por defecto, la aplicación Alpha se iniciará, pero después de que el usuario lo ha personalizado, la aplicación Beta se iniciará a partir de ahora .. ¿Alguna idea?

Gracias

Gracias por el comentario Victor.

Usar el InputMethodService no me proporcionará suficiente libertad y funcionalidad para manejar mis problemas.

Mi solución / Compromiso

Dentro de Android Framework, hay un PhoneWindowManager que es responsable de manejar InputEvents . El WindowManagerService que es iniciado por el SystemServer , es propietario de este gestor y crea una instancia.

Al crear mi propio WindowManager personalizado y dejarlo heredar de PhoneWindowManager de Android, no pierdo ninguna funcionalidad por defecto y esto me permite añadir mi propia implementación dentro de esta clase. Esto resulta agregando un nuevo archivo al framework y cambiando solo una línea dentro de Android Framework: WindowManagerService no creará un PhoneWindowManager , pero creará un CustomPhoneWindowManager (extends PhoneWindowManager).

Si alguien ve una mejor solución o tiene alguna reflexión específica sobre mi compromiso, no dude en comentar. 🙂

Dudo que sea posible con API públicas (Boy y Martijn señalaron problemas de seguridad).

La mayoría de tus mejores apuestas (si no quieres personalizar Android) sería

A) Intente utilizar InputMethodService (http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html)

No le da ese tipo de control que usted desea, pero podría ser suficiente para algunas necesidades.

B) Trate de pasar por toda la pila (del kernel a la aplicación) y encuentre algunas vulnerabilidades para usar.

Esto definitivamente llevará mucho tiempo y no garantiza traer ninguna fruta.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.