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

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

サンプルコード

[java]
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();
}
}
[/java]

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

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

参考