Sử dụng onCallStateChanged() thông qua PhoneStateListener bạn chỉ có thể phát hiện khi điện thoại bắt đầu để thực hiện cuộc gọi đi và khi cuộc gọi đi được hunged lên nhưng bạn không thể xác định khi nào một "chuông" được bắt đầu. Tôi đã thử một lần, hãy kiểm tra mã bên dưới:
Cuộc gọi đi bắt đầu từ IDLE đến OFFHOOK khi được gọi ra, đến IDLE khi bị treo. Cách giải quyết duy nhất là sử dụng bộ hẹn giờ để gác máy sau khi cuộc gọi đi bắt đầu và một vài giây trôi qua, nhưng sau đó, bạn sẽ không bao giờ được đảm bảo điện thoại sẽ bắt đầu đổ chuông.
public abstract class PhoneCallReceiver extends BroadcastReceiver {
static CallStartEndDetector listener;
@Override
public void onReceive(Context context, Intent intent) {
savedContext = context;
if(listener == null){
listener = new CallStartEndDetector();
}
TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}
public class CallStartEndDetector extends PhoneStateListener {
int lastState = TelephonyManager.CALL_STATE_IDLE;
boolean isIncoming;
public PhonecallStartEndDetector() {}
//Incoming call- IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when hung up
//Outgoing call- from IDLE to OFFHOOK when dialed out, to IDLE when hunged up
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if(lastState == state){
//No change
return;
}
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
isIncoming = true;
//incoming call started
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//Transition of ringing->offhook are pickups of incoming calls. Nothing down on them
if(lastState != TelephonyManager.CALL_STATE_RINGING){
isIncoming = false;
//outgoing call started
}
break;
case TelephonyManager.CALL_STATE_IDLE:
//End of call(Idle). The type depends on the previous state(s)
if(lastState == TelephonyManager.CALL_STATE_RINGING){
// missed call
}
else if(isIncoming){
//incoming call ended
}
else{
//outgoing call ended
}
break;
}
lastState = state;
}
}
}
Nguồn
2014-03-19 02:44:29