Android监听电话状态

<span style="background-color: rgb(255, 255, 255);">
</span>
1.监听电话的操作需要相应的权限,首先在AndroidManifest配置权限

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

2.电话的监听需要用到的类

实现手机电话状态的监听,主要依靠两个类:TelephoneManger和PhoneStateListener。 
TelephonseManger提供了取得手机基本服务的信息的一种方式。因此应用程序可以使用TelephonyManager来探测手机基本服务的情况。应用程序可以注册TelephonyManager.listener来监听电话状态的改变。我们不能对TelephonyManager进行实例化,只能通过获取服务的形式:Context.getSystemService(Context.TELEPHONY_SERVICE)

主要静态成员常量:(它们对应PhoneStateListener.LISTEN_CALL_STATE所监听到的内容)
int CALL_STATE_IDLE   空闲状态,没有任何活动。
int CALL_STATE_OFFHOOK  摘机状态,至少有个电话活动。该活动或是拨打(dialing)或是通话,或是 on hold。并且没有电话是ringing or waiting
int CALL_STATE_RINGING  来电状态,电话铃声响起的那段时间或正在通话又来新电,新来电话不得不等待的那段时间。

3.电话状态接收广播

Android在电话状态改变是会发送action为android.intent.action.PHONE_STATE的广播,而拨打电话时会发送action为android.intent.action.NEW_OUTGOING_CALL的广播。因此我们写一个BroadcastReceiver就能获得对电话状态的监听

先注册广播:
     <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>

实现BroadcastReceiver
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{

			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 来电号码
			super.onCallStateChanged(state, incomingNumber);
<span style="white-space:pre">			</span>//自己的逻辑要放在super后,不然的话incomingNumber获取不到
			switch(state){
			case TelephonyManager.CALL_STATE_IDLE://<span style="font-family: Verdana; font-size: 13px; line-height: 19px;">空闲状态,没有任何活动。</span>
				System.out.println("挂断");
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK://<span style="font-family: Verdana; font-size: 13px; line-height: 19px;">摘机状态,至少有个电话活动。该活动或是拨打(dialing)或是通话,或是 on hold。并且没有电话是ringing or waiting</span>
				System.out.println("接听");
				break;
			case TelephonyManager.CALL_STATE_RINGING://<span style="font-family: Verdana; font-size: 13px; line-height: 19px;">来电状态,电话铃声响起的那段时间或正在通话又来新电,新来电话不得不等待的那段时间。</span>
				System.out.println("响铃:来电号码"+incomingNumber);
				//输出来电号码
				break;
			}
		}
		
	};
}



你可能感兴趣的:(android)