Android: перечисление кнопок на геймпаде

У меня есть Android-устройство, к которому можно подключить геймпад (это совершенно стандартный контроллер XBox 360, но мне нужно поддерживать и другие разновидности). Геймпад отображается как InputDevice с некоторыми аналоговыми осями и некоторыми кнопками.

Мне нужно иметь возможность запросить Android, чтобы узнать, какие кнопки поддерживает геймпад. Кто-нибудь знает как это сделать?

Я знаю, что у системы есть эта информация, потому что если я напишу приложение командной строки, которое открывает /dev/input/event... и запрашивает кнопки с помощью EVIOCGBIT ioctl, я получаю хороший список поддерживаемых кнопок от ядра. Но я не могу сделать это из приложения Android, потому что у меня нет разрешения на прямой доступ к устройствам ввода.

Похоже, должно быть возможно получить объект KeyCharacterMap InputDevice и запросить его; но похоже, что Android прикрепил раскладку клавиатуры QWERTY по умолчанию к геймпаду, вместо того, чтобы создать раскладку, которая действительно соответствует тому, что поддерживает геймпад. Это с радостью скажет мне, что на геймпаде есть клавиша Q, которой нет, и что у него нет клавиши BUTTON_X, которая есть, и для которой я получаю ключевые события. Так что это не помогает.

Есть какой-либо способ сделать это?


person David Given    schedule 27.07.2012    source источник
comment
На это должна быть документация от вашего поставщика. Какое устройство вы используете?   -  person Lukas Knuth    schedule 27.07.2012
comment
Любой --- это должно быть портативное решение.   -  person David Given    schedule 27.07.2012


Ответы (1)


Я еще не придумал способ, но я нашел ужасное обходное решение.

Если вы позвоните KeyCharacterMap.deviceHasKey(keycode), я смогу узнать у Android, поддерживает ли любое устройство ввода в системе указанный код клавиши. Перебирая все возможные кнопки, которые могут встречаться на геймпаде (полезно, что все они называются KeyEvent.KEYCODE_BUTTON_something), я могу выяснить, что любой подключенный геймпад должен поддерживать по крайней мере некоторые из этих кнопок.

Не очень приятное решение --- если у меня одновременно подключен контроллер XBox 360 и Wiimote, то я не могу понять, что на контроллере XBox нет кнопок 1 или 2, а у Wiimote нет X или Y, например. Но по крайней мере это начало.

Если у кого-то есть идеи получше, подскажите...

person David Given    schedule 30.07.2012
comment
Похоже, они наконец добавили это в уровень API 19 (4.4) с InputDevice.hasKeys: developer.android.com/reference/android/view/ - person Ted Mielczarek; 15.04.2014