今回は、「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; };
実行結果
実行結果は以下の通り。
実行時
着信のみの時
着信/通話の時