Androidの自動化アプリを作りたくて、色々試してみたので備忘録します。
まず結論から。
スマホ単体では実現できませんでした。
セキュリティの問題で、普通のアプリには権限が付与されていないみたいです。
rootアプリやシステムアプリなら出来るんですが、それだと敷居が高いので今回は対象外です。
それを踏まえたうえでご覧ください。
方法1
パソコンから 「input touchscreen」コマンドを投げる。
言わずと知れた方法ですね。
検索するとたくさん出てきます。
Android と パソコンを USBデバッグ で繋いで adb で shell を実行します。
1 | ./adb shell input touchscreen tap x y |
この方法は、前回 Python でやっているので割愛です。
方法2
Android アプリ内で Shell コマンドを実行する。
Android は Java で動いているので、Runtime.exec() で 別プログラムが実行できます。
なので、exec で 「input touchscreen tap x y」をやって上げれば クリック出来るんじゃないかと思います。
出来ませんでしたけどね。
エラーにならないで、空振りしている感じです。
試しにアプリを作ってみました。
https://github.com/noitaro/ShellTest
adb shell から投げれるコマンドを アプリ内から直接実行してみました。
1 | ./adb shell pm list packages |
これで、行ける!!
って思ったんですが、そうは問屋が卸しません。
アプリがハングアップしました。
方法3
1+2のハイブリッド型
アプリだけで完結出来ないので、1+2のハイブリッド型で実装します。
まず最初に、パソコンから adb shell を使って Input Host Server を立ち上げます。
次に、アプリから Input Host Server にタッチ情報を送ってデバイスをタップさせます。
欠点は、初めに一度だけ、パソコンと繋いで Input Host Server を立ち上げないと行けないことですね。
でもまあ一度立ち上げてしまえば、アンドロイドを再起動するまで使えるので、いいんじゃないでしょうか。
よくないか。
物は試しでアプリにしました。
https://github.com/noitaro/ResetMara
Input Host Server 開始
APK を入れたら、パソコン側から adb を使って Shell 権限で実行させます。
1 | ./adb shell |
ちなみに CLASSPATH はインストールした端末毎に違います。
調べ方は pm コマンドでパッケージパスを投げると返ってきます。
1 | ./adb shell pm path com.example.resetmara |
この部分は、起動ツールでも作ろうと思います。
今はとりあえずコマンドを直叩きします。
アプリの TAP ボタンを押す
したらば、Input Host Server に タップ情報が投げられて、Input Host Server が実機をタップします。
ちゃんと指定した箇所がタップされています。
おわりに
とりあえず、やりたいことのやり方が分かりました。
次は、今回のことを踏まえて、Android アプリでマクロを組めるようにしてみたいと思います。