電話の発着信を横取りする

電話発信を横取りする

手順は以下

1.ブロードキャストレシーバーを作成
2.1のインテントフィルターのアクションに以下を指定する
 "android.intent.action.NEW_OUTGOING_CALL"
 "android.intent.action.ACTION_CALL"(無くても一応いける)
3.パーミッションに以下を追加する
 "android.permission.PROCESS_OUTGOING_CALLS"
4.発信をキャンセルするため、BroadcastReceiver::onReceive内で"setResultData(null)"を呼ぶ。

電話着信を横取りする

手順は以下

1.ブロードキャストレシーバーを作成
2.1のインテントフィルターのアクションに以下を指定する
 "android.intent.action.PHONE_STATE"
3.パーミッションに以下を追加する
 "android.permission.READ_PHONE_STATE"
 "android.permission.MODIFY_PHONE_STATE"
 "android.permission.CALL_PHONE"
 "android.permission.CALL_PRIVILEGED"
3.ITelephonyManger(非公開クラス)のaidlファイルを作る

 package com.android.internal.telephony;

  interface ITelephony { 
    boolean endCall();

    void answerRingingCall();

    void silenceRinger();
 }

4.ITelephonyManagerのインスタンスを取得(TelephonyManagerクラスの非公開APIを使う)
5.ITelephonyManager::silenceRingerを呼んで、呼び出し音を消す
6.ITelephonyManager::endCallを呼んで、着信を切る

4,5,6は以下のようなコードになる。

		TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);  
		try {
			Class<?> c = Class.forName(telephony.getClass().getName());
			Method m = c.getDeclaredMethod("getITelephony");
			m.setAccessible(true);
			ITelephony telephonyService = (ITelephony) m.invoke(telephony);
			//呼び出し音を消す。
			telephonyService.silenceRinger();
			//着信を切る
			telephonyService.endCall();
		} catch (Exception e) {
			e.printStackTrace();
		}

電話着信の横取りについては、非公開APIを使っているため、今後使えなくなる可能性がある。