Android: enumerando los botones de un gamepad

Tengo un dispositivo Android en el que se puede conectar un gamepad (es un controlador totalmente estándar XBox 360, pero también necesito apoyar otras variedades). El gamepad se muestra como un InputDevice con algunos ejes analógicos y algunos botones.

Necesito poder consultar a Android para averiguar qué botones soporta el gamepad. ¿Alguien sabe como hacer esto?

Sé que el sistema tiene esta información, porque si escribo una aplicación de línea de comandos que abre /dev/input/event... y consulta los botones usando el ioctl de EVIOCGBIT , obtengo una lista agradable de botones soportados del kernel. Pero no puedo hacerlo desde una aplicación de Android, porque no tengo permiso para acceder directamente a los dispositivos de entrada.

Parece que debería ser posible obtener el objeto KeyCharacterMap del InputDevice y consultarlo; Pero parece que Android ha conectado el teclado predeterminado del teclado QWERTY al gamepad, en lugar de construir uno que realmente coincida con lo que admite el gamepad. Esto me contará con alegría que el gamepad tiene una clave Q, que no lo hace, y que no tiene una tecla BUTTON_X, lo que hace, y por lo que estoy recibiendo eventos clave. Eso no ayuda.

¿Hay alguna manera de hacer esto?

Todavía no he descubierto un camino, pero he encontrado una solución horrible.

Si llama a KeyCharacterMap.deviceHasKey(keycode) , puedo preguntar a Android si cualquier dispositivo de entrada del sistema admite el código de clave especificado. Por iterar a través de todos los botones posibles que pueden ocurrir en un gamepad ( KeyEvent.KEYCODE_BUTTON_something , todos ellos son llamados KeyEvent.KEYCODE_BUTTON_something ), puedo entender que cualquier gamepad conectado debe soportar al menos algunos de estos botones.

No es una solución muy agradable — si tengo un controlador XBox 360 y un Wiimote conectado al mismo tiempo, entonces no puedo entender que el controlador XBox no tiene botones 1 o 2, y el Wiimote no tiene X o Y, por ejemplo. Pero al menos es un comienzo.

Si alguien tiene mejores ideas, por favor sugerir algunas …

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