AndroidのIntentをコマンドから投げる

色々と検索しているうちに偶然中国の方が非常に参考になる記事を書いているのを見つけました。
もちろん中国語でしたので読めないのですが、Googleに翻訳をしてもらいました。
中国語は英語に翻訳するとかなり良い翻訳が得られると思います。

翻訳結果

こちらの記事にて初めて知ったのですが、AndroidLinuxにはamというコマンドがあり、Intentをコマンドラインから投げることができます。

以下がヘルプです。

$ adb shell
# am
am
usage: am [start|instrument]
       am start [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
                [-c <CATEGORY> [-c <CATEGORY>] ...]
                [-e <EXTRA_KEY> <EXTRA_VALUE> [-e <EXTRA_KEY> <EXTRA_VALUE> ...]

                [-n <COMPONENT>] [-D] [<URI>]
       am instrument [-e <ARG_NAME> <ARG_VALUE>] [-p <PROF_FILE>]
                [-w] <COMPONENT>
#

例えば次のように直接アプリケーションを起動することができます。

# am start -n com.google.android.browser/com.google.android.browser.BrowserActivity
am start -n com.google.android.browser/com.google.android.browser.BrowserActivity
Starting: Intent { comp={com.google.android.browser/com.google.android.browser.BrowserActivity} }

上のとおりに入力するとブラウザが実行され、ホームページ(デフォルトではGoogle)が表示されるはずです。

上の実行はコンポーネントを直接実行しておりますが、ActionとDataを用いたIntentの特徴である疎結合な呼出も可能です。
例えば、

# am start -a android.intent.action.VIEW http://www.google.com
am start -a android.intent.action.VIEW http://www.google.com
Starting: Intent { action=android.intent.action.VIEW data=http://www.google.com}

上記ではhttpで始まるURIに対してVIEWを行うため、やはりブラウザが表示されGoogleが表示されます。

しかし、次のようにgeo:を使いますと、

# am start -a android.intent.action.VIEW geo:35.698683,139.774219
am start -a android.intent.action.VIEW geo:35.698683,139.774219
Starting: Intent { action=android.intent.action.VIEW data=geo:35.698683,139.774219 }

Mapsアプリが実行され、秋葉原駅周辺が表示されます。
geo:ではGETのqオプションが利用できますので以下のように地名を指定することも可能です。

# am start -a android.intent.action.VIEW geo:0,0?q=Tokyo
am start -a android.intent.action.VIEW geo:0,0?q=Tokyo
Starting: Intent { action=android.intent.action.VIEW data=geo:0,0?q=Tokyo }
Warning: Activity not started, its current task has been brought to the front
#

上記のように入力すると東京が表示されます。
なぜかしら代々木ですね。
ダイアログや吹き出しの表示は画面の下にあるバックキーを押すと消えます。



さらにACTIONにCALLを、URIにtel:を用いると、

# am start -a android.intent.action.CALL tel:88888888
am start -a android.intent.action.CALL tel:88888888
Starting: Intent { action=android.intent.action.CALL data=tel:88888888 }
#

電話がかけられることが確認できます。
エミュレータでは実際にかけることができませんが、通話が開始した状態になります。


自分で試してみたところ実行できるのはActivityであり、ServiceもIntentを用意してstartServiceにて実行するものの、このamコマンドでは実行できないようです。
自作のActivityの呼出はもちろん大丈夫でした。



Androidには標準でかなりの数のIntentが用意されています。
丸山先生のAndroid勉強会の第一ターンでも多くのIntentが紹介されました。

一々プログラムを書かずにIntentの試験を行えるのは便利です。
またこのようなコマンドがあるということはC言語のライブラリレベルでもIntentが使えるのではないでしょうか。
ソースの公開がまた楽しみになりましたね。