androidでのキーイベントを発行

アプリでキーボード叩きたいですか?
Yeah!

通常キーの発行の仕方

KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0);
dispatchKeyEvent(event);

普通にやればいい

アルファベット大文字の発行の仕方

long eventTime = SystemClock.uptimeMillis();
KeyEvent event1 = new KeyEvent( eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A, 1, 65 );
dispatchKeyEvent(event1);

KeyEventの6つの引数をもったものを利用する
65はたぶん
META_SHIFT_LEFT_ON
META_SHIFT_ON
の値だと思われる
CTRLなどのキーはMETA系って言うんだと思うし
META系はKeyEvent6つ引数版でやる様子。

enterの発行の仕方

KeyEvent event1 = new KeyEvent( eventTime, eventTime, KeyEvent.ACTION_MULTIPLE , KeyEvent.KEYCODE_ENTER, 1, 0 );
dispatchKeyEvent(event1);

これが一番難儀だった。
@Override dispatchKeyEventで待ち構えていても
なぜかEnterは捉えることが出来ず諦めかけてたが
ググりまくってたらenterの発行ではなかったが
KeyEvent.ACTION_MULTIPLEを利用するコードが有り
もしかしてと試したらビンゴだった・・
(これが出来たときは相当雄叫び上げたと思うw)


KeyEvent.ACTION_MULTIPLEは未だに意味がわからないが
まあ、特殊な動作なんだろうなー



ってことで、発行したいキーによって作法がいろいろあるので、
条件分岐で対応ってことになるかと思う。



ちなみにadb経由でもキーイベントは発生できて

adb shell input keyevent 29

とすると「a」が送れます。


これを応用すると

Runtime.getRuntime().exec("input keyevent 29");

って具合にプログラムからでもキーが送れます





たぶんここに辿り着いた人は
何かしらの外部機器からの入力で
キーボードエミュレーションしたいんだと思う。
自分はそうだったわけだけど


で、思いついたのは
・1:ソフトウエアキーボードの開発をする
・2:simejiプラグイン(マッシュルーム)を書く
・3:Servicesで裏からキーを操作する
・4:専用アプリ上で仕方なく操作
だった。


1は明らかに自身のスペックでは無理、断念

2はどうも入力された文字をsimejiからプラグインに渡して「文字置換」をするっていうことだったので
 リアルタイムな入力は無理そうだった。

3は試したところなんとかいけそうな気配だったが
 Manifest android.permission.INJECT_EVENTSがセキュリティに引っかかり
 にっちもさっちもいかない状況・・
 Rootとれば出来るんだろうけど、なんともやるせない・・


結局一周回って4におちつくという、骨折り損のくたびれ儲け


ちかれた・・


参考になったらはてなスターでもつけといてくださいw