监听通话状态,有两种方式,一种是通过四大组件的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列为危险权限了,使用该功能需要获得用户的授权方可正常运行。
至此,完!
我不是大神,我只不过是一个一直在努力的人