HoneyComb端末にゲームコントローラを接続する
|Android3.1(HoneyComb)から、AndroidはUSB Hostに対応しました。
USB Hostに対応したことで、XboxやPS3などのコントローラを接続し、
Applicationの制御に使用することができるようになりました。
※USBコントローラの接続には、USBホストケーブルが必要になります。
Techboosterでは、InputDevice系統の記事として、以下記事を過去に公開しています。
本エントリでも同様に参考になるので、ご参考に。
USB接続時のデバック方法
USBホストケーブル接続時には、PCとUSBケーブルを繋ぐことができませんので、
通常通りADBデバッグすることができません。
ただし、PCと同じWifiアクセスポイントへタブレット端末が接続されている場合には、
Wifi経由でのADB接続が可能です。
方法は以下の手順になります。
1.デバイスのIPアドレスを取得
設定アプリ→無線とネットワーク→Wi-Fi設定→接続済みのAPを選択
ダイアログ内のIPアドレスの項目を参照
2.WiFiからのADB接続
接続前に、USB経由で普段通りに接続を行います。
その後以下コマンドを実行します。
adb tcpip 5555 adb connect device-ip-address:5555
※device-ip-addressには1.で取得したIPアドレスを入力
USBコントローラのイベント
USBコントローラは、ハードキー(ハードキーボード)同様にKeyEventとして、ActivityまたはViewに通知されることになります。
これまでのハードキーの入力制御方法がコントローラを接続するだけで、そのまま使えることになります。
Activityでの操作を例に挙げると、
- onKeyDown(int keyCode, KeyEvent event)
- onKeyUp(int keyCode, KeyEvent event)
- dispatchKeyEvent(KeyEvent event)
などで、入力時の制御を行うことができます。
※参考:Android Developers @Activity
SampleCodeはdispatchKeyEventでの押下ボタンのチェック
※少し長いですが、テスト時にでもお使いいただけると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 | @Override public boolean dispatchKeyEvent(KeyEvent ev) { if (ev.getAction() == KeyEvent.ACTION_DOWN) { // キーコード表示 TextView tv = new TextView( this ); tv.setText( "DOWN : " + "DeviceId[" + ev.getDeviceId() + "] " + "Source[" + getSourceName(ev.getSource()) + "] " + "KeyCode[" + getKeyCodeName[ev.getKeyCode()] + "] " ); llayout.addView(tv); } else if (ev.getAction() == KeyEvent.ACTION_UP) { /* Action Upの時の処理 */ } return super .dispatchKeyEvent(ev); } private final String getSourceName( int src){ String ret = null ; switch (src){ case InputDevice.SOURCE_ANY: ret = "SOURCE_ANY" ; break ; case InputDevice.SOURCE_CLASS_BUTTON: ret = "SOURCE_CLASS_BUTTON" ; break ; case InputDevice.SOURCE_CLASS_JOYSTICK: ret = "SOURCE_CLASS_JOYSTICK" ; break ; case InputDevice.SOURCE_CLASS_MASK: ret = "SOURCE_CLASS_MASK" ; break ; case InputDevice.SOURCE_CLASS_POINTER: ret = "SOURCE_CLASS_POINTER" ; break ; case InputDevice.SOURCE_CLASS_POSITION: ret = "SOURCE_CLASS_POSITION" ; break ; case InputDevice.SOURCE_CLASS_TRACKBALL: ret = "SOURCE_CLASS_TRACKBALL" ; break ; case InputDevice.SOURCE_DPAD: ret = "SOURCE_DPAD" ; break ; case InputDevice.SOURCE_GAMEPAD: ret = "SOURCE_GAMEPAD" ; break ; case InputDevice.SOURCE_JOYSTICK: ret = "SOURCE_JOYSTICK" ; break ; case InputDevice.SOURCE_KEYBOARD: ret = "SOURCE_KEYBOARD" ; break ; case InputDevice.SOURCE_MOUSE: ret = "SOURCE_MOUSE" ; break ; case InputDevice.SOURCE_TOUCHPAD: ret = "SOURCE_TOUCHPAD" ; break ; case InputDevice.SOURCE_TOUCHSCREEN: ret = "SOURCE_TOUCHSCREEN" ; break ; case InputDevice.SOURCE_TRACKBALL: ret = "SOURCE_TRACKBALL" ; break ; case InputDevice.SOURCE_UNKNOWN: ret = "SOURCE_UNKNOWN" ; break ; default : ret = "UNKOWN_VAL" ; } return ret; } String getKeyCodeName[] ={ "KEYCODE_UNKNOWN" , "KEYCODE_SOFT_LEFT" , "KEYCODE_SOFT_RIGHT" , "KEYCODE_HOME" , "KEYCODE_BACK" , "KEYCODE_CALL" , "KEYCODE_ENDCALL" , "KEYCODE_0" , "KEYCODE_1" , "KEYCODE_2" , "KEYCODE_3" , "KEYCODE_4" , "KEYCODE_5" , "KEYCODE_6" , "KEYCODE_7" , "KEYCODE_8" , "KEYCODE_9" , "KEYCODE_STAR" , "KEYCODE_POUND" , "KEYCODE_DPAD_UP" , "KEYCODE_DPAD_DOWN" , "KEYCODE_DPAD_LEFT" , "KEYCODE_DPAD_RIGHT" , "KEYCODE_DPAD_CENTER" , "KEYCODE_VOLUME_UP" , "KEYCODE_VOLUME_DOWN" , "KEYCODE_POWER" , "KEYCODE_CAMERA" , "KEYCODE_CLEAR" , "KEYCODE_A" , "KEYCODE_B" , "KEYCODE_C" , "KEYCODE_D" , "KEYCODE_E" , "KEYCODE_F" , "KEYCODE_G" , "KEYCODE_H" , "KEYCODE_I" , "KEYCODE_J" , "KEYCODE_K" , "KEYCODE_L" , "KEYCODE_M" , "KEYCODE_N" , "KEYCODE_O" , "KEYCODE_P" , "KEYCODE_Q" , "KEYCODE_R" , "KEYCODE_S" , "KEYCODE_T" , "KEYCODE_U" , "KEYCODE_V" , "KEYCODE_W" , "KEYCODE_X" , "KEYCODE_Y" , "KEYCODE_Z" , "KEYCODE_COMMA" , "KEYCODE_PERIOD" , "KEYCODE_ALT_LEFT" , "KEYCODE_ALT_RIGHT" , "KEYCODE_SHIFT_LEFT" , "KEYCODE_SHIFT_RIGHT" , "KEYCODE_TAB" , "KEYCODE_SPACE" , "KEYCODE_SYM" , "KEYCODE_EXPLORER" , "KEYCODE_ENVELOPE" , "KEYCODE_ENTER" , "KEYCODE_DEL" , "KEYCODE_GRAVE" , "KEYCODE_MINUS" , "KEYCODE_EQUALS" , "KEYCODE_LEFT_BRACKET" , "KEYCODE_RIGHT_BRACKET" , "KEYCODE_BACKSLASH" , "KEYCODE_SEMICOLON" , "KEYCODE_APOSTROPHE" , "KEYCODE_SLASH" , "KEYCODE_AT" , "KEYCODE_NUM" , "KEYCODE_HEADSETHOOK" , "KEYCODE_FOCUS" , "KEYCODE_PLUS" , "KEYCODE_MENU" , "KEYCODE_NOTIFICATION" , "KEYCODE_SEARCH" , "KEYCODE_MEDIA_PLAY_PAUSE" , "KEYCODE_MEDIA_STOP" , "KEYCODE_MEDIA_NEXT" , "KEYCODE_MEDIA_PREVIOUS" , "KEYCODE_MEDIA_REWIND" , "KEYCODE_MEDIA_FAST_FORWARD" , "KEYCODE_MUTE" , "KEYCODE_PAGE_UP" , "KEYCODE_PAGE_DOWN" , "KEYCODE_PICTSYMBOLS" , "KEYCODE_SWITCH_CHARSET" , "KEYCODE_BUTTON_A" , "KEYCODE_BUTTON_B" , "KEYCODE_BUTTON_C" , "KEYCODE_BUTTON_X" , "KEYCODE_BUTTON_Y" , "KEYCODE_BUTTON_Z" , "KEYCODE_BUTTON_L1" , "KEYCODE_BUTTON_R1" , "KEYCODE_BUTTON_L2" , "KEYCODE_BUTTON_R2" , "KEYCODE_BUTTON_THUMBL" , "KEYCODE_BUTTON_THUMBR" , "KEYCODE_BUTTON_START" , "KEYCODE_BUTTON_SELECT" , "KEYCODE_BUTTON_MODE" , "KEYCODE_ESCAPE" , "KEYCODE_FORWARD_DEL" , "KEYCODE_CTRL_LEFT" , "KEYCODE_CTRL_RIGHT" , "KEYCODE_CAPS_LOCK" , "KEYCODE_SCROLL_LOCK" , "KEYCODE_META_LEFT" , "KEYCODE_META_RIGHT" , "KEYCODE_FUNCTION" , "KEYCODE_SYSRQ" , "KEYCODE_BREAK" , "KEYCODE_MOVE_HOME" , "KEYCODE_MOVE_END" , "KEYCODE_INSERT" , "KEYCODE_FORWARD" , "KEYCODE_MEDIA_PLAY" , "KEYCODE_MEDIA_PAUSE" , "KEYCODE_MEDIA_CLOSE" , "KEYCODE_MEDIA_EJECT" , "KEYCODE_MEDIA_RECORD" , "KEYCODE_F1" , "KEYCODE_F2" , "KEYCODE_F3" , "KEYCODE_F4" , "KEYCODE_F5" , "KEYCODE_F6" , "KEYCODE_F7" , "KEYCODE_F8" , "KEYCODE_F9" , "KEYCODE_F10" , "KEYCODE_F11" , "KEYCODE_F12" , "KEYCODE_NUM_LOCK" , "KEYCODE_NUMPAD_0" , "KEYCODE_NUMPAD_1" , "KEYCODE_NUMPAD_2" , "KEYCODE_NUMPAD_3" , "KEYCODE_NUMPAD_4" , "KEYCODE_NUMPAD_5" , "KEYCODE_NUMPAD_6" , "KEYCODE_NUMPAD_7" , "KEYCODE_NUMPAD_8" , "KEYCODE_NUMPAD_9" , "KEYCODE_NUMPAD_DIVIDE" , "KEYCODE_NUMPAD_MULTIPLY" , "KEYCODE_NUMPAD_SUBTRACT" , "KEYCODE_NUMPAD_ADD" , "KEYCODE_NUMPAD_DOT" , "KEYCODE_NUMPAD_COMMA" , "KEYCODE_NUMPAD_ENTER" , "KEYCODE_NUMPAD_EQUALS" , "KEYCODE_NUMPAD_LEFT_PAREN" , "KEYCODE_NUMPAD_RIGHT_PAREN" , "KEYCODE_VOLUME_MUTE" , "KEYCODE_INFO" , "KEYCODE_CHANNEL_UP" , "KEYCODE_CHANNEL_DOWN" , "KEYCODE_ZOOM_IN" , "KEYCODE_ZOOM_OUT" , "KEYCODE_TV" , "KEYCODE_WINDOW" , "KEYCODE_GUIDE" , "KEYCODE_DVR" , "KEYCODE_BOOKMARK" , "KEYCODE_CAPTIONS" , "KEYCODE_SETTINGS" , "KEYCODE_TV_POWER" , "KEYCODE_TV_INPUT" , "KEYCODE_STB_POWER" , "KEYCODE_STB_INPUT" , "KEYCODE_AVR_POWER" , "KEYCODE_AVR_INPUT" , "KEYCODE_PROG_RED" , "KEYCODE_PROG_GREEN" , "KEYCODE_PROG_YELLOW" , "KEYCODE_PROG_BLUE" , "KEYCODE_APP_SWITCH" , "KEYCODE_BUTTON_1" , "KEYCODE_BUTTON_2" , "KEYCODE_BUTTON_3" , "KEYCODE_BUTTON_4" , "KEYCODE_BUTTON_5" , "KEYCODE_BUTTON_6" , "KEYCODE_BUTTON_7" , "KEYCODE_BUTTON_8" , "KEYCODE_BUTTON_9" , "KEYCODE_BUTTON_10" , "KEYCODE_BUTTON_11" , "KEYCODE_BUTTON_12" , "KEYCODE_BUTTON_13" , "KEYCODE_BUTTON_14" , "KEYCODE_BUTTON_15" , "KEYCODE_BUTTON_16" , }; |
サンプル中KEYCODE_ESCAPE以降のKeyCodeがHoneyComb以降で追加されたものになります。
また、手持ちのPS2コントローラ<–>USB変換ケーブルを使用したところ、正常に値がとれました。
XboxやPS3のコントローラに限らず、様々なコントローラからの入力が可能となっている様です。
※参考:変換ケーブル使用のPS2コントローラ入力結果
※XboxやPS3コントローラの場合には、結果が異なる可能性があります。
上記コードを持ったActivityがフォアグラウンドの状態で、コントローラのボタンを押下すると認識したキーコードを出力するサンプルになります。