2012年3月25日日曜日

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

こちらの記事にて初めて知ったのですが、AndroidのLinuxには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の呼出はもちろん大丈夫でした。

0 件のコメント:

コメントを投稿