2015-02-03 3 views
1

Раньше toroid android lolipop обнаружил, что исходящий вызов отвечает или нет, проверяя продолжительность звонка, если вызов не ответил, значит, длительность вызова остается 0 сек. Но в android Lolipop длительность звонка запускается до ответа на вызов. Есть ли способ обнаружить, что исходящий вызов отвечает или нет в android lolipop?Как определить, ответил ли исходящий звонок или нет в ororid Lolipop?

ответ

0

Вы можете переопределить прослушиватель onCallStateChanged с помощью Telephony Manager.

@Override 
    public void onCallStateChanged(int state, String number) { 
     switch (state) { 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       // call established. 
       break; 
     } 
+0

CALL_STATE_OFFHOOK будет получить срабатывает, как только мы нажимаем на кнопку вызова, но мне нужно, чтобы найти, был ли дан ответ другим пользователем или нет этот вызов. В ниже уровня API 19 мы можем найти, используя длительность вызова, но выше API 19, продолжительность вызова начинается, когда мы нажимаем кнопку CALL. – Kamalanathan

+0

Наконец-то вышло решение по вышеуказанной проблеме https://code.google.com/p/android/issues/detail?id=79592. В android 5.1 длительность вызова работает нормально для исходящих вызовов. – Kamalanathan

0

У меня есть рабочее решение для обнаружения ответа на исходящий звонок! Решение немного взломано, но оно работает, по крайней мере, в Samsung S6 с Android 6.0.1. Я также тестировал Nexus 5x с Android 7.1.1, но это не сработало.

Способ, которым я пользуюсь, заключается в использовании Audio Manager для изменения аудиомода в MODE_IN_COMMUNICATION, когда я получаю состояние исходящего вызова в EXTRA_STATE_OFFHOOK. После изменения аудиомода на MODE_IN_COMMUNICATION, я запускаю поток, который контролирует аудиомод, пока система не вернет его обратно в MODE_IN_CALL, когда на вызов будет дан ответ.

Вот фрагмент кода:

final AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
if (outgoingCallAnswerWatchThread != null){ 
    outgoingCallAnswerWatchThread.interrupt(); 
    outgoingCallAnswerWatchThread = null; 
} 

outgoingCallAnswerWatchThread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     // by changing the audio mode to MODE_IN_COMMUNICATION 
     // we can then detect when the call is answered 
     // because android changes the audio mode back to MODE_IN_CALL 
     // when that happens 
     audioManager.setMode(MODE_IN_COMMUNICATION); 

     while(callState == RINGING && !Thread.interrupted()){ 
      try { 
       Thread.sleep(CALL_WATCHER_SLEEP_TIME_MS); 
      } catch (InterruptedException e) { 
       Log.d(TAG, "Thread interrupted!"); 
       break; 
      } 


      int audioMode = audioManager.getMode(); 

      Log.d(TAG, "audioMode:" + audioMode); 

      if (audioMode == MODE_IN_CALL){ 
       //the call is connected 
       Log.i(TAG, "OUTGOING CALL answered!"); 
      } 

     } 

    } 
}); 


outgoingCallAnswerWatchThread.start(); 
Смежные вопросы