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 件のコメント:
コメントを投稿