2011-06-20 47 views
10

Tôi đang làm việc trên một ứng dụng Android mà tôi muốn là có thể thực hiện cuộc gọi nhưng với giới hạn rất chính xác, đây là "thực hiện cuộc gọi nhỡ". Những gì tôi muốn là, để có thể treo lên chỉ là thời điểm điện thoại bắt đầu đổ chuông.Làm thế nào để thực hiện cuộc gọi nhỡ?

ngay bây giờ tôi có thể biết khi điện thoại bắt đầu thử và thực hiện cuộc gọi , nhưng trong vài giây không có hoạt động "đổ chuông" trên mạng , đó là những gì tôi sẵn sàng làm.

Làm cách nào để có thể dừng thời điểm chính xác này?

Trả lời

2

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; 
     } 

    } 



} 
Các vấn đề liên quan