3月 08
Android の会のメーリングリストで電話の発信をフックする方法についての話題が挙っていたので、私の知っている範囲で記事にします。

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.png

サンプルアプリ

実際に NEW_OUTGOING_CALL を捕捉するサンプルアプリを作ってみました。

発信のたびに NEW_OUTGOING_CALL を捕捉しても困ってしまいますので、アプリから捕捉するタイミングを制御できるようにしました。このため単純なアプリではなく、Activity と Service と Receiver からなるアプリケーションになっています。

アプリを起動するとサービスを開始するボタン、サービスを停止するボタン、ダイヤラーを開くボタンの3つのボタンを表示した画面が現れます。これがメイン画面です。

device-1.png

サービスを開始するボタンを押すと NEW_OUTGOING_CALL の捕捉を開始します。サービス起動中はステータス画面にこのメイン画面を呼び出すための Notofication が表示されています。

ダイヤラーを開く画面を押すと『117』が入力された状態でダイヤラー画面が開きます。

device-2.png

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

device-3.png

サンプルコード

ここで挙げたサンプルアプリのソースコードは Google Code で公開しています。

注意点としては、NEW_OUTGOING_CALL を捕捉するために AndroidManifest.xml の中で以下のパーミッションを指定するのを忘れてはいけません。

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>


Posted by sak+

Tagged with:
preload preload preload