监听通话状态,有两种方式,一种是通过四大组件的BroadcastReceiver(广播接收者)、另一种则是通过创建一个类继承PhoneStateListener来实现

一、通过BroadcastReceiver实现
创建一个继承BroadcastReceiver的类,实现其onReceive方法,并在AndroidManifest.xml文件注册该广播接收者,然后需要使用onReceive给的context来获取系统服务

public class PhoneReceiver extends BroadcastReceiver {
	@Override
    public void onReceive(final Context context, Intent intent) {
    	TelephonyManager manager = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
    }
}

这样我们就得到了一个TelephonyManager 的对象

通过Android官网的开发文档我们可以了解到,有一个方法可以返回设备的呼叫状态:getCallState()

android service获取通话状态 获取设备通话状态_kotlin

点击即可跳转到相对应的方法描述

android service获取通话状态 获取设备通话状态_java_02


这个方法,可以在调用后返回三个呼叫状态,分别是:

CALL_STATE_IDLE //空闲状态
CALL_STATE_RINGING //通话中
CALL_STATE_OFFHOOK //振铃

android service获取通话状态 获取设备通话状态_android_03


知道了返回值,我们就可以使用switch语句来实现相关的监听通话状态

switch (manager.getCallState()) {
	case TelephonyManager.CALL_STATE_IDLE:
		 Log.d(TAG, "***空闲状态中****");
		 break;
	case TelephonyManager.CALL_STATE_OFFHOOK:
		 Log.d(TAG, "***振铃中****");
		 break;
	case TelephonyManager.CALL_STATE_RINGING:
		 Log.d(TAG, "***通话中****");
		 break;
}

当通话状态结束时,会再次执行并返回一个空闲状态

二、通过继承PhoneStateListener类实现

通过继承PhoneStateListener实现通话状态的监听,我们需要重写其onCallStateChanged()方法,该方法用于监听设备调用更改时的状态,类似上文提到的getCallState()方法

android service获取通话状态 获取设备通话状态_移动开发_04


回调的第一个int值,即是和getCallState()一样的返回值,第二个字符是当前用户所拨打的电话号码,而不是来电号码,获取来电号码需另写代码,获取去电电话号码时,还需申请有相应权限方可获取,否则phoneNumber值将是一个空字符串

android service获取通话状态 获取设备通话状态_java_05

public class MyPhoneStateListener extends PhoneStateListener {
	@Override
	public void onCallStateChanged(int state, String number) {
		switch(){
			case TelephonyManager.CALL_STATE_IDLE:
		 		Log.d(TAG, "***空闲状态中****");
				break;
			case TelephonyManager.CALL_STATE_OFFHOOK:
		 		Log.d(TAG, "***振铃中****");
		 		break;
			case TelephonyManager.CALL_STATE_RINGING:
		 		Log.d(TAG, "***通话中****");
		 		break;
		}
	}
}

使用的时候将其启动即可

TelephonyManager manager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE));
MyPhoneStateListener mpsListener = new MyPhoneStateListener();
manager.listen(mpsListener, 290);

值得注意的是通话被Google列为危险权限了,使用该功能需要获得用户的授权方可正常运行。