2013-11-24 5 views
2

AudioManager не уверен в onCallStateChanged. Во время телефонного звонка мне нужно, чтобы он включил громкоговоритель и установил громкость на максимум. Он иногда включает громкую связь (обычно во время второго или более позднего вызова) и редко увеличивает громкость. Мой класс PhoneCallListener входит в мой класс MainActivity.AudioManager не относится к нужной степени.

private class PhoneCallListener extends PhoneStateListener 
{ 
    private boolean isPhoneCalling = false; 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) 
    { 
     AudioManager aM = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     aM.setMode(AudioManager.MODE_IN_CALL); 
     aM.setSpeakerphoneOn(true); 

     if(TelephonyManager.CALL_STATE_RINGING == state) 
     { 
      //phone ringing 
      aM.setSpeakerphoneOn(true); 
      aM.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); 
     } 

     if(TelephonyManager.CALL_STATE_OFFHOOK == state) 
     { 
      //phone active 
      aM.setSpeakerphoneOn(true); 
      aM.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0); 
      isPhoneCalling = true; 
     } 

     if(TelephonyManager.CALL_STATE_IDLE == state) 
     { 
      aM.setSpeakerphoneOn(false); 

      if(isPhoneCalling) 
      {    
       Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 
       i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(i); 
       isPhoneCalling = false; 
      } 
     } 
    } 
} 

В CALL_STATE_OFFHOOK мне пришлось отключить AudioManager.FLAG_SHOW_UI, потому что он постоянно будет показывать объем пользовательского интерфейса. Кроме того, установка aM.setStreamVolume (AudioManager.STREAM_MUSIC, aM.getStreamMaxVolume (AudioManager.STREAM_MUSIC), 0); по какой-то причине приводит к сбою приложения.

Любые предложения о том, как заставить AudioManager работать каждый раз, чтобы громкая связь была включена, а громкость была максимальной во время телефонного звонка?


Edit: Даже с установкой speackphoneon к истине, как только onCallStateChanged вызывается метод, он до сих пор достоверно не поворачивая громкую. Громкость также ненадежна и не может показаться ей максимальной, без сбоев.

+0

Вы заметили, что сам телефон отключает громкую связь при приеме вызова? Поэтому, если вы оба попытаетесь установить его одновременно и выключить, неудивительно, что он будет включаться только иногда. –

+0

Этот код используется, когда телефон звонит, а не получает. Когда вызов сделан, я хочу включить громкую связь. – user3001127

+0

То же самое - если телефон отключит его изначально, точка в том, что вы должны попробовать ожидание в течение 1 секунды, прежде чем включать его после приема вызова, чтобы он не переписывался обратно на «выключен» по телефону. –

ответ

0

Ниже приведено код для этого. Я протестировал на телефоне с леденец. Написать PhoneStateListener как:

private class myPhoneStateListener extends PhoneStateListener { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 

     switch (state) { 

      case TelephonyManager.CALL_STATE_OFFHOOK: //Call is established 
       Log.d("[email protected]", "Call is Offhook now!"); 
       try { 
        Thread.sleep(500); //We never know when the call is actually OffHook 
       } catch (InterruptedException e) { 
       Log.d("[email protected]","Exception is:"+e); 
       } 
       audioManager.setSpeakerphoneOn(true); 
       break; 

      case TelephonyManager.CALL_STATE_IDLE: //Call is finished 
        //Maintain a flag and do this only if speakerphone has been set on OFFHOOK 
        /*audioManager.setMode(AudioManager.MODE_NORMAL); 
        audioManager.setSpeakerphoneOn(false);*/ 
       break; 
     } 
    } 
} 

Для повышения громкости звонка вы должны увеличить объем STREAM_VOICE_CALL. Этот код + увеличение объема потока вызовов будет соответствовать вашим требованиям.