Android 端末での電話発信について
Android の電話アプリは実際には2つのアプリから構成されています。
- Contacts (com.android.contacts)
- Phone (com.android.phone)
Contacts はダイヤラーや電話帳などのアプリです。Phone は実際に通話を制御するアプリです。発着信画面や通話画面は Phone のアプリです。この2つのアプリと電話帳や発着信履歴などのデータ(ContentProviderで保持)は互いに連携して1つのアプリケーションかのように動作しています。
Contacts が Phone を呼び出すトリガーは暗黙的INTENT ACTION_CALL です。Phone はこれを受けたのち一旦 NEW_OUTGOING_CALL をブロードキャスト送信します。ここで他のアプリが発信をフックする機会を与えます。通常はそのまま自分自身がこのブロードキャストを受信し発信処理を進めます。

サンプルアプリ
実際に NEW_OUTGOING_CALL を捕捉するサンプルアプリを作ってみました。
発信のたびに NEW_OUTGOING_CALL を捕捉しても困ってしまいますので、アプリから捕捉するタイミングを制御できるようにしました。このため単純なアプリではなく、Activity と Service と Receiver からなるアプリケーションになっています。
アプリを起動するとサービスを開始するボタン、サービスを停止するボタン、ダイヤラーを開くボタンの3つのボタンを表示した画面が現れます。これがメイン画面です。

サービスを開始するボタンを押すと NEW_OUTGOING_CALL の捕捉を開始します。サービス起動中はステータス画面にこのメイン画面を呼び出すための Notofication が表示されています。
ダイヤラーを開く画面を押すと『117』が入力された状態でダイヤラー画面が開きます。

必要に応じてここで電話番号を変更してください。電話番号を確認したら発信を行います。本来ならば発信画面が現れて電話の発信が行われるはずですが、サンプルアプリで NEW_OUTGOING_CALL をフックして別の画面が表示されます。

サンプルコード
ここで挙げたサンプルアプリのソースコードは Google Code で公開しています。
注意点としては、NEW_OUTGOING_CALL を捕捉するために AndroidManifest.xml の中で以下のパーミッションを指定するのを忘れてはいけません。

