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