Android没有未接电话的监视器,但是有个PhoneStateListener可以监听当前状态,所以如果想要处理未接来电事件的话可以通过监听手机状态的改变判断是否是未接来电然后再进行处理
实现思路:
1.继承PhoneStateListener后当手机状态改变会调用onCallStateChanged函数。
● CALL_STATE_IDLE = 0 :空闲状态
● CALL_STATE_RINGING = 1 :响铃状态
● CALL_STATE_OFFHOOK = 2 :摘机状态(通话中)
2.记录上次状态的改变和本次状态,若当前状态为空闲且上次状态为响铃则可认为是未接来电(实际上如果这样判断的话机主主动挂断电话也会被默认为未接电话,这个时候可以再加一层判断,即未接来电个数大于0的时候才默认为未接电话,这样就可以实现了)
准备步骤:
首先在正式写代码之前让我们先看看手机来电过程中状态是如何改变的。
监听代码如下:
public
class
CallReceive
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context,
Intent
intent) {
TelephonyManager
tm = (
TelephonyManager
) context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
);
tm.
listen
(
new
CallListener
(),
PhoneStateListener
.
LISTEN_CALL_STATE
);
}
public
class
CallListener
extends
PhoneStateListener
{
private
int
lastState
=
TelephonyManager
.
CALL_STATE_IDLE
;
@Override
public
void
onCallStateChanged
(
int
state,
String
incomingNumber) {
//
TODO
Auto-generated method stub
super
.
onCallStateChanged
(state, incomingNumber);
Log
.d(
"xxx"
,
"hello state is "
+ state +
" ---- incomimgNumber is "
+ incomingNumber);
}
};
}
打印log如下: adb logcat -s xxx
响铃状态:
D/xxx ( 3687): hello state is 1 ---- incomingNumber is 13950739450
D/xxx ( 3687): hello state is 0 ---- incomingNumber is
呼叫方挂断:
D/xxx ( 3687): hello state is 0 ---- incomingNumber is 13950739450
D/xxx ( 3687): hello state is 0 ---- incomingNumber is 13950739450
D/xxx ( 3687): hello state is 0 ---- incomingNumber is
这里存在一个本人觉得很奇怪的地方,在响铃的过程中会发出一次state = 0的状态,想了很久没明白,后面同事猜测说是因为这个状态改变只是发出去让开发者知道下然后就会切换为0的状态以便监听下一个电话,或许是这样吧,本人才疏学浅,暂时不知道怎么去跟踪。刚开始只是通过state去判断,因为这个万恶的0弄了很久,因为当来电过程中跑出个0导致在通话过程中就开始处理未接来电事件了。后面查看log发现当为0时incomingNumber是空的,然后再加上这个判断才算正确的判断了是否未接来电。
实现代码:
public
class
CallReceive
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context,
Intent
intent) {
TelephonyManager
tm = (
TelephonyManager
) context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
);
tm.
listen
(
new
CallListener
(),
PhoneStateListener
.
LISTEN_CALL_STATE
);
}
public
class
CallListener
extends
PhoneStateListener
{
private
int
lastState
=
TelephonyManager
.
CALL_STATE_IDLE
;
@Override
public
void
onCallStateChanged
(
int
state,
String
incomingNumber) {
//
TODO
Auto-generated method stub
super
.
onCallStateChanged
(state, incomingNumber);
System
.
out
.
println
(
"state is "
+ state +
" ----- incomingNumber is "
+ incomingNumber);
if
((state == 0) && (
lastState
== 1) && !
isNullOrEmpty
(incomingNumber)) {
sendMsgWhenMissedCall
();
}
if
(!
isNullOrEmpty
(incomingNumber))
lastState
= state;
}
private
void
sendMsgWhenMissedCall
() {
}
}
public
boolean
isNullOrEmpty
(
String
string) {
return
(string.
equals
(
""
) || string ==
null
);
}
}
在AndroidManifest.xml中注册此Receiver:
<
receiver
android:name
=
".CallReceive"
>
<
intent-filter
>
<
action
android:name
=
"android.intent.action.PHONE_STATE"
/>
</
intent-filter
>
</
receiver
>
另外记得加上监听电话状态改变的权限:
<
uses-permission
android:name
=
"android.permission.READ_PHONE_STATE"
/>
至此,判断未接来电算是成功解决了,至于刚开始所说的获取未接来电个数的下次有空了再去实现。