Android電話状態の傍受(着信と発信)PhoneStateListenerとTelephonyManager

2582 ワード

今日のプログラムでは、電話の状態が変わったときに起動(着信、受話器、切断、電話をかける)することができますが、電話をかけるときに相手が受話器に出るかどうか、音声メールを回すかどうかなどを判断することはできません.Androidは電話の状態が変わるとandroidにactionを送信します.intent.action.PHONE_STATEのアナウンスで、電話をかけるとandroidとしてactionが送信されます.intent.action.NEW_OUTGOING_CALLの放送ですが、開発文書を見てみましたが、着信時の放送はしばらく見つかりませんでした.これを知っていればやりやすいので、BroadcastReceiverを書いてこの2つの放送を受信すればいいです.
package com.pocketdigi.phonelistener;
 
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
 
public class PhoneReceiver extends BroadcastReceiver {
 
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("action"+intent.getAction());
		if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
			//     (  )
			System.out.println("  ");
		}else{
			//   android  ,             action,  ,      
			System.out.println("  ");
			TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);   
			tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
			//       
		}
	}
	PhoneStateListener listener=new PhoneStateListener(){
 
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			// TODO Auto-generated method stub
			//state      incomingNumber,       API
			super.onCallStateChanged(state, incomingNumber);
			switch(state){
			case TelephonyManager.CALL_STATE_IDLE:
				System.out.println("  ");
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:
				System.out.println("  ");
				break;
			case TelephonyManager.CALL_STATE_RINGING:
				System.out.println("  :    "+incomingNumber);
				//      
				break;
			}
		}
 
	};
}

AndroidManifestでxml登録ブロードキャスト受信機:
 <receiver android:name=".PhoneReceiver">
        	<intent-filter>
        		<action android:name="android.intent.action.PHONE_STATE"/>
		<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        	</intent-filter>
        </receiver>

権限も追加します.
 <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>

変換元:http://www.pocketdigi.com/20110725/417.html