AndroidアプリからKey emulation

最近、Androidアプリからキー入力をエミュレーションさせる方法を調べていました。「ADBコマンドでキーを送信することができるので簡単にできるだろう」と思っていたら、難しかったです(スキル不足?)。

リフレクションでWindowManagerのインスタンスを取得して、IWindowManager#injectKeyEventメソッド呼び出ししています。リフレクションだらけのコードは、あんまり使いたくないですね。

サンプルコード

private void keyUpDown(int keycode) {
  ClassLoader loader = ClassLoader.getSystemClassLoader();
  try {
    Class serviceManagerClazz = loader.loadClass("android.os.ServiceManager");
    Method getServiceMethod = serviceManagerClazz.getMethod("getService", String.class);
    Object windowObj = getServiceMethod.invoke(null, "window");
    Class windowManagerStubClazz = loader.loadClass("android.view.IWindowManager$Stub");
    Method asInterfaceMethod = windowManagerStubClazz.getMethod("asInterface", IBinder.class);
    Object iwindowObj = asInterfaceMethod.invoke(null, windowObj);
    Class windowManagerClazz = loader.loadClass("android.view.IWindowManager");
    Method method = windowManagerClazz.getMethod("injectKeyEvent", KeyEvent.class, boolean.class);
    method.invoke(iwindowObj, new KeyEvent( KeyEvent.ACTION_DOWN, keycode), true);
    method.invoke(iwindowObj, new KeyEvent( KeyEvent.ACTION_UP, keycode), true);
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  } catch (SecurityException e) {
    e.printStackTrace();
  } catch (NoSuchMethodException e) {
    e.printStackTrace();
  } catch (IllegalArgumentException e) {
    e.printStackTrace();
  } catch (IllegalAccessException e) {
    e.printStackTrace();
  } catch (InvocationTargetException e) {
    e.printStackTrace();
  }
}

こんな感じです。Android 2.3ではHOMEキーは押せないので注意です。他のアプリにキー送信できるのかな・・??

誰か、他にも良いやり方を知っていれば、教えてください。

参考