[独習android]シェルコマンド(シェルスクリプトなど)をアプリから実行する
アプリからシェルコマンドやシェルスクリプトを呼べると便利だよね
Dynabook AZ(#aznyan)の起き上がり問題に対処しようとして色々調べた断片
ポイント
- Runtimeクラスを使う
http://developer.android.com/reference/java/lang/Runtime.html - 連続してコマンド投げる時は DataOutputStream を取得して書き込む
サンプルコード
// root取得してサスペンドイベントを投げる private void suspend() { try { Process p = Runtime.getRuntime().exec("su"); DataOutputStream dos = new DataOutputStream(p.getOutputStream()); dos.writeBytes("sendevent /dev/input/event0 1 142 1\n"); // 押す dos.writeBytes("sendevent /dev/input/event0 1 142 0\n"); // 離す dos.writeBytes("exit\n"); } catch (IOException e) { e.printStackTrace(); } }
おまけ
サンプルコードでは su を呼んでrootを取得し、Input Subsystemを利用して、sendevent で コード 142(Dynabook AZのサスペンド) の押す/離す をシミュレートしているです。以下を参照
- Linux Input Subsystemの使い方
http://www.aya.or.jp/~takuo/input_subsystem/input_subsystem.html
androidで入力デバイスを操作したときにどんなイベントが投げられているかはシェルで getevent というコマンドを使うと調べられる。例: geteventを実行して ‘a’ キーを押したとき
/ # getevent add device 1: /dev/input/event4 name: "AVRCP" add device 2: /dev/input/event3 name: "nvec ec_event" add device 3: /dev/input/event1 name: "nvec mouse" could not get driver version for /dev/input/mouse0, Not a typewriter add device 4: /dev/input/event0 name: "nvec keyboard" could not get driver version for /dev/input/mice, Not a typewriter add device 5: /dev/input/event2 name: "USB Camera" /dev/input/event0: 0001 001e 00000001 /dev/input/event0: 0001 001e 00000000
関連情報
- 「android-dev」タグの付いたエントリ http://groundwalker.com/blog/tag/android-dev
- Android SDK関連の書籍 http://amzn.to/SS0jff