2012年10月15日月曜日

Call をフックするもうひとつの方法

Android の会のメーリングリストで電話の発信のフックについての議論が盛り上がってますが、ACTION_CALL_PRIVILEGED をフックするっていう手もあるんですね。私も知りませんでした。というわけで team-hiroq さんの「CALLアクションをフック – Android」という記事を参考に実際にやってみました。

うーむ。フィルターに追加するだけで簡単に Call をフックできちゃうんですね。知らなかったー

せっかくなのでこれもサンプルに加えちゃいます。ただ team-hiroq さんと同じ方法では面白くないので設定によってこのフィルターを有効にしたり無効にしたりできるようにしました。この際 IntentFilter 自体を Activity に追加したり削除したりできないか調べたんですがそのような API が見当たりません。そんなとき Twitter で @dumapick さんから PackageManager.setComponentEnabledSetting を使ったらいいんじゃね?というツイートをいただき、Taosoftware さんの「Android Intent呼び出しを自分でコントロール方法」という記事を見つけ出しました。

要するに IntentFilter を持った Activity ごと有効にしたり無効にしたりということですね。

で、どっちが強いの?

で、前回記事にした NEW_OUTGOING_CALL を使った方法と今回紹介した CALL_PRIVILEGED を使う方法。2つ同時に適用した場合どっちが優先されるか気になるところなのですが、実際に試したところメーリングリストで team-hiroq さんが指摘しているように CALL_PRIVILEGED の方が優先されるようです。

使い分け

なので、NEW_OUTGOING_CALL と CALL_PRIVILEGED の使い分けを考えるとすると。ユーザに使うアプリを意識させても良い場合は CALL_PRIVILEGED 、意識させたくない場合は NEW_OUTGOING_CALL ということになるでしょうか?例えば、電話発信先を制限するようなアプリを作る場合には NEW_OUTGOING_CALL しかないと思いますし。IP電話のようなアプリは CALL_PRIVILEGED でも良いかな?と思います。

サンプルアプリ

それでは今回のサンプルアプリの紹介をします。

起動するとひとつのチェックボックスとひとつのボタンを持った画面が現れます。

device-1.png

チェックボックスを有効にして電話の発信を行おうとすると、アプリの選択画面が現れます。この場合、通常の「電話」とこのサンプルアプリ「CallHook」に2択です。

device-2.png

「CallHook」を選択すると電話を発信せず用意した Activity を開きます。発信しようとした電話番号が取得できるので表示させています。

device-3.png

サンプルコード

前回同様、サンプルアプリのソースコードは Google Code で公開しています。

0 件のコメント:

コメントを投稿