【Android】监听通话状态

监听通话状态,有两种方式,一种是通过四大组件的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()
在这里插入图片描述

点击即可跳转到相对应的方法描述
在这里插入图片描述
这个方法,可以在调用后返回三个呼叫状态,分别是:

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

在这里插入图片描述
知道了返回值,我们就可以使用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()方法
在这里插入图片描述
回调的第一个int值,即是和getCallState()一样的返回值,第二个字符是当前用户所拨打的电话号码,而不是来电号码,获取来电号码需另写代码,获取去电电话号码时,还需申请有相应权限方可获取,否则phoneNumber值将是一个空字符串
在这里插入图片描述

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列为危险权限了,使用该功能需要获得用户的授权方可正常运行。

至此,完!

我不是大神,我只不过是一个一直在努力的人

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宾有为

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值