サイト移転のお知らせ:http://techbooster.org/に移転しました

InputEventで入力デバイスを特定する

12月 21, 2010   //   by @mhidaka   //   アプリケーション  //  1 Comment

MotionEventでマルチタッチを検出する ではidによるマルチタッチ制御の方法を紹介しました。マルチタッチ検出の導入と同時に、入力デバイスを特定するための仕組み、InputEventも追加されています。InputEventはKeyEventMotionEventの親クラスで、入力機器に関する情報を持っています。

InputDeviceの主な定数

定数名 概要
SOURCE_DPAD 513 (0x00000201)十字キー
SOURCE_KEYBOARD 257 (0x00000101)キーボード
SOURCE_MOUSE 8194 (0x00002002)マウス
SOURCE_TOUCHPAD 1048584 (0x00100008)タッチパッド
SOURCE_TOUCHSCREEN 4098 (0x00001002)タッチスクリーン
SOURCE_TRACKBALL 65540 (0x00010004)トラックボール
SOURCE_UNKNOWN 0 (0x00000000)不明なデバイス


入力デバイス(ソース)を示す定数を抜粋しました。これらの定数値はビット演算のために、キリの良い値になっていません。たとえばSOURCE_KEYBOARDは0×00000101ですが下2桁が入力デバイスの分類(SOURCE_CLASS)を表します。

入力デバイスを特定するためのInputDeviceはInputEvent(MotionEvent, KeyEvent)から取得できます。
以下はサンプルコードです

MotionEventの場合

	@Override
	public boolean onTouchEvent(MotionEvent event) {

		// InputDeviceの取得
		InputDevice inputDevice = event.getDevice();
		int deviceId = event.getDeviceId(); // デバイスIDを取得

		int source = event.getSource();

		Log.d("TouchEvent", "Input Device " + deviceId + " Source:" + source
				+ " X:" + event.getX() + ",Y:" + event.getY());

		return true;
	}

MotionEvent#getDeviceでInputDeviceを取得できます。同時にgetDeviceIdでデバイスIDを取得していますが、デバイスIDに関しては、どのデバイスからの入力なのか、判断のために利用します(今回は取得して表示)。ユニークであることは保証されていますが、Android端末の種類によって値は異なりますので注意してください。

MotionEvent#getSource()で入力デバイスを取得できます。

Logcat

12-20 18:44:04.613: DEBUG/TouchEvent(369): Input Device 0 Source:4098 X:188.0,Y:213.0
12-20 18:44:04.703: DEBUG/TouchEvent(369): Input Device 0 Source:4098 X:188.0,Y:213.0

Source:4098 はSOURCE_TOUCHSCREENですね。

KeyEventの場合

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO 自動生成されたメソッド・スタブ

		// InputDeviceの取得
		InputDevice inputDevice = event.getDevice();
		int deviceId = event.getDeviceId(); // デバイスIDを取得

		int source = event.getSource();

		Log.d("KeyEvent", "Input Device " + deviceId + " Source:" + source
				+ " key:" + event.getKeyCode());

		return super.onKeyDown(keyCode, event);
	}

KeyEventの場合もMotionEventと同様です。
Sourceは257(=SOURCE_KEYBOARD)です。

Logcat

12-20 18:44:17.772: DEBUG/KeyEvent(369): Input Device 0 Source:257 key:34
12-20 18:44:18.283: DEBUG/KeyEvent(369): Input Device 0 Source:257 key:35

関連する記事:

Sponsored Link

1 Comment

  • [...] InputEventで入力デバイスを特定する Android 2.3 [...]

技術書新刊 発売中

アンドロイドアカデミアには、CIやテスト、互換検証など実務に生きるノウハウをあつめています

技術書新刊 発売中

Android Next!はAndroid 7.0に対応したはじめての技術書です!


The Web Explorer 2はCSSの中央寄せやWebAudioなど未来を読み解く一冊です


Revised TypeScript in DefinitelylandはTypeScript 2.0(β)に対応した解説書です。インストールから型定義まで幅広くサポートしています


技術書をかこう!はエンジニアらしい執筆環境を構築、HowTo本です