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での押下ボタンのチェック
※少し長いですが、テスト時にでもお使いいただけると思います。
@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がフォアグラウンドの状態で、コントローラのボタンを押下すると認識したキーコードを出力するサンプルになります。
