PhoneStateListenerを使って着信イベントを取得する


今回は、「PhoneStaetListener」を使って「着信のイベント」を取得する方法を紹介します。
TelephonyManagerのlisten-Methodに「PhoneStateListener」を登録し、
「onCallStateChanged」をOverrideすることで、着信時のイベントを取得することができます。

続きで具体的な方法を紹介します。

手法を紹介する前に、少しだけ寄り道を。

エミュレーターでの着信の発生

エミュレーター使用環境でも電話の着信を起こす事ができます。

エミュレーターが立ち上がった状態で、DDMSの「Emulator Control」タブの
「Telephony Actions」の項目を利用します。

Incomming number (エミュに)着信のある電話番号
Phone 電話イベント
SMS SMSイベント
Message SMSの際に使用
Call エミュレータに電話をかける


TelephonyManagerの準備

TelephonyManagerを使って端末の状態を取得する
の項目に習い、getSystemServiceからTELEPHONY_SERVICEを取得します。

mTelephonyManager
        = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);

TelephonyManagerのlisten-Methodに「PhoneStateListener」を登録します。
#前後が逆転しますが、Listenerは後述。

mTelephonyManager.listen
        (mPhoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);

PhoneStateListener

PhoneStateListenerの実体を書きます。
今回は、以下の様にTextViewを追加する様にサンプルを書きました。

イベント名 出力文字 起こるタイミング
CALL_STATE_RINGING 着信 電話番号 着信時
CALL_STATE_OFFHOOK 通話中 通話開始時
CALL_STATE_IDLE 待ち受け中 待ち受け状態への変化時
<pre>PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
   	@Override
   	public void onCallStateChanged(int state, String number) {
   		phoneCallEvent(state, number);
       }
   };

   private void phoneCallEvent(int state, String number){
	switch(state) {
        /* 各状態でTextViewを追加する */
        case TelephonyManager.CALL_STATE_RINGING:
			/* 着信 */
        	TextView tv_ring = new TextView(this);
        	tv_ring.setText("着信  " + number);
        	lLayout.addView(tv_ring);

        	break;

        case TelephonyManager.CALL_STATE_OFFHOOK:
			/* 通話 */
        	TextView tv_offhook = new TextView(this);
        	tv_offhook.setText("通話中" + number);
        	lLayout.addView(tv_offhook);
            break;

        case TelephonyManager.CALL_STATE_IDLE:
			/* 待ち受け */
        	TextView tv_idle = new TextView(this);
        	tv_idle.setText("待ち受け状態" + number);
        	lLayout.addView(tv_idle);
        	break;
	};

実行結果

実行結果は以下の通り。
実行時

着信のみの時

着信/通話の時

3 Comments