2011年10月25日火曜日

【Android】 KeyEventの発行

KeyEventの発行についてまとめておきます。

KeyEventですが、基本的にIWindowManagerにあるinjectKeyEventを呼び出すことで
可能なのですが、残念ながら公開されているインターフェースではなく、リフレクションを
使う方法でしか呼び出しができません。

そこでいろいろ調べていたのですが、Instrumentationクラスを用いることで可能なことが
分かりました。

http://developer.android.com/reference/android/app/Instrumentation.html

InstrumentationクラスにあるsendKeySyncイベントなどを発行することで可能となります。

ただ、上記のAPIは、UIスレッドでは呼び出し不可能なので、別スレッドを作成して、そこから
呼び出す必要があります。以下、適当なコードですけどサンプルを載せておきます。

以下の手順で動作確認できます。

1. Musicをならす
2. 以下のアプリを起動
3. Buttonを押すと、Musicが停止したり、再開したりさせれます。(Play-Pauseキーなので)

全面のActivityにまずKeyEventが発行され、その後、IntentでMusic側に流れている
ことが確認できます。
public class SandBoxActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Button b = (Button) this.findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
KeyEventSender sender = new KeyEventSender();
sender.execute(null);
}
});
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
android.util.Log.d("TEMPORARY", "keyCode = " + keyCode);
return super.onKeyDown(keyCode, event);
}

private class KeyEventSender extends AsyncTask {
@Override
protected Object doInBackground(Object... params) {
Instrumentation ist = new Instrumentation();
ist.sendKeyDownUpSync(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
return null;
}
}
}

0 件のコメント:

コメントを投稿