タイトルはちょっと、つりですが、まだまだ、間違いをしているアプリケーションがありますので、大げさにしました。

以前に書いたパーミッションなしで○○するシリーズですが、一番有名な電話をかけるパーミッションのCALL_PHONEは後回しにと思ってたら、書くのを忘れていましたので、改めて書きました。

内容に関しては、切り口は違いますが色々な所で記載されています。

パーミッションなしで○○するシリーズ

CALL_PHONEパーミッションなしで電話をかける方法

電話を発信するには、AndroidManifestにCALL_PHONEパーミッションの利用宣言をする必要があります。


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

CALL_PHONEのprotection levelは、dangerousで、前述したSEND_SMSと同じく非常に危険なパミッションです。このパーミッションを持っているアプリケーションは、自由に電話発信することが出来ます。もちろん電話をかけると金銭が発生します。日本ではサービス停止になりましたが、ダイアルQ2のような電話サービスに電話をかけるだけで通信事業者の料金に加え、サービス料が請求されます。また海外通話を行ってしまうと高額な金額が請求されます。ちょっと古い方は、インターネット初期に勝手にダイアルQ2に電話をかけるマルウェアがあり高額請求が発生したのを思い出して頂けたらと思います。

CALL_PHONE パミッションをアプリケーションが持つ事は非常に危険なのでユーザにも嫌われます。必要でなければCALL_PHONEパミッションを付けないようにするのが良いでしょう。SMSの時と同じように電話の発信においても、最終的に電話をかける操作をユーザに任せる事で、CALL_PHONEパミッションを利用宣言することなく、電話発信が可能です。

android.permission.CALL_PHONEが必要なパターン

need_call_phone.png

ソース

AndroidManifest.xml


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

Intent intentcall = new Intent();
intentcall.setAction(Intent.ACTION_CALL);
intentcall.setData(Uri.parse("tel:" + phonenumber));
startActivity(intentcall);
実行画面

自動的に発信され通話が始まる。

action_call.png

android.permission. CALL_PHONEが必要ないパターン

no_need_call_phone.png

ソース

Intent intentcall = new Intent();
intentcall.setAction(Intent.ACTION_DIAL);
intentcall.setData(Uri.parse("tel:" + phonenumber));
startActivity(intentcall);
実行画面

この後利用者が「発信」ボタンを押すと通話が開始される。

action_dial.png

Intentを用いた発信の2つは非常に似ているソースコードですが、CALL_PHONEパーミッションが必要ないパターンでは利用者が、能動的に発信ボタンを押す必要があり利用者が自分で発信をコントロールするのでパーミッションが必要ありません。

まとめ

アクション 動作 パミッション
ACTION_CALL 呼び出し後直ぐに電話通話をする CALL_PHONE
ACTION_DIAL 電話番号が挿入された画面を開く
その後ユーザが発信ボタンを押すと通話が始まる
必要なし

良くあるのは、ソーシャル系のアプリケーションで友人に電話をかけるために必要ということで、CALL_PHONEパーミッションが付いている物があります。しかしながら、ACTION_DIALを使用する事で十分な物が数多くあります。

CALL_PHONE機能を利用され、他のアプリケーションから自由に電話をかけられるような脆弱性をアプリケーションに入れてしまう事もあります。直接的にお金に影響を及ぼすパーミッションですので、なるべく使用しない事をお勧めします。

ブログ内の関連する記事