Android监听来电和去电

#Android监听来电和去电
Android在电话状态改变是会发送action为android.intent.action.PHONE_STATE的广播,而拨打电话时会发送action为android.intent.action.NEW_OUTGOING_CALL的广播。
来电没有直接广播,通过android.intent.action.PHONE_STATEandroid.intent.action.NEW_OUTGOING_CALL两个进行过滤。
思路:如果电话状态改变了,而且接受到的不是NEW_OUTGOING_CALL广播,可以确定是来电状态,以此来区分拨打电话和来电。

##拨打电话
注册Intent.ACTION_NEW_OUTGOING_CALL广播

##来电
结合了拨打电话的广播,非去电就是来电
通过TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE)
进行电话状态的获取

##实现

###广播监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class PhoneReceiver extends BroadcastReceiver {
private static boolean incomingFlag = false;
// private String incomingNumber;
@Override
public void onReceive(Context context, Intent intent) {
//拨打电话
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
incomingFlag = false;
final String phoneNum = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.d("PhoneReceiver", "phoneNum: " + phoneNum);
} else {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);
}
}
final PhoneStateListener listener=new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch(state){
//电话等待接听
case TelephonyManager.CALL_STATE_RINGING:
incomingFlag = true;
Log.i("PhoneReceiver", "CALL IN RINGING :" + incomingNumber);
break;
//电话接听
case TelephonyManager.CALL_STATE_OFFHOOK:
if (incomingFlag) {
Log.i("PhoneReceiver", "CALL IN ACCEPT :" + incomingNumber);
}
break;
//电话挂机
case TelephonyManager.CALL_STATE_IDLE:
if (incomingFlag) {
Log.i("PhoneReceiver", "CALL IDLE");
}
break;
}
}
};
}

###广播注册

1
2
3
4
5
6
7
8
<receiver android:name="com.huaban.deskspirit.receiver.PhoneReceiver" >
<intent-filter>
<!-- 获取来电广播 -->
<action android:name="android.intent.action.PHONE_STATE" />
<!-- 获取去电广播 -->
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>

###注意
拦截的广播不能进行动态注册,动态注册不能监听到NEW_OUTGOING_CALL,拨打电话的状态。

虽然是个简单的功能,还是非常的使用的,可以结合归属地地图,以及桌面的电话拦截等等

yeungeek wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
曾经有一份打赏放在我面前,我没有珍惜.如果上天给我再来一次的机会,我会说三个字:赏死我.