有了广播的基础概念之后,如果通过广播进行电话呼入呼出的监听?当然现在还做不到一种悄无声息的监听,因为你至少需要安装你写的应用!

  • 马上学Android 027 -BroadcastReceiver的使用教程02 - 监听电话记录

电话的监听,想想肯定是需要申请一定的权限来实现的,需要申请的权限如下:

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

注册广播的方法和步骤在上一讲给出了,那么有了广播接收器之后,需要声明一个电话状态监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

PhoneStateListener phoneStateListener = new PhoneStateListener(){

@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state){
case TelephonyManager.CALL_STATE_IDLE:
Log.i("broadcast","挂断");
break;

case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i("broadcast","接听");
break;

case TelephonyManager.CALL_STATE_RINGING:
Log.i("broadcast","有电话呼入,来电号码:"+incomingNumber);
break;
}
}
};

有了这个监听逻辑之后,那么在接收到电话状态改变的广播之后,需要对电话的状态进行判断(是呼入,还是呼出?)

1
2
3
4
5
6
7
8
9
10
11
12

@Override
public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(CALLACTION)) {//捕获准备进行拨号的消息
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i("broadcast", "有人在再打电话:" + phoneNumber);
} else { //今天呼入的电话状态
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);
}
}

telephonyManager的listen()需要传入上面定义的phoneStateListener

这样就是实现了电话呼入和呼出的监听了!

(视频中在判断电话状态的呼入状态为写break语句,大家记得补上!)