2011-06-20 18 views
10

Pracuję nad aplikacją na Androida, na której chcę być w stanie wykonywać połączenia, ale z bardzo precyzyjnym ograniczeniem, to jest "wykonywanie połączeń nieodebranych". To, czego chcę, to móc rozłączyć się tylko na chwilę, gdy telefon zacznie dzwonić.Jak wykonywać nieodebrane połączenia?

teraz jestem w stanie dowiedzieć się, kiedy telefon zaczyna próbować wykonać połączenie , ale przez kilka sekund nie ma aktywności "dzwonienia" w sieci , co chcę zrobić.

Jak mogę zatrzymać ten dokładny moment?

Odpowiedz

2

Używanie onCallStateChanged() za pośrednictwem PhoneStateListener można wykryć dopiero po włączeniu telefonu, aby połączenia wychodzącego i gdy połączenie wychodzące jest hunged się, ale nie można określić, kiedy rozpoczyna się "dzwonienie". Próbowałem raz, sprawdź poniższy kod:

Połączenie wychodzące rozpoczyna się od IDLE do OFFHOOK po wybraniu, do IDLE po zawieszeniu. Jedynym sposobem obejścia tego problemu jest użycie rozłącznika czasowego do rozłączenia się po rozpoczęciu połączenia wychodzącego i kilku sekundach, ale nigdy nie gwarantuje się, że telefon zacznie dzwonić.

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

    } 



} 
Powiązane problemy