2013-11-24 121 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,因爲它會持續顯示音量UI。另外,設置a.setStreamVolume(AudioManager.STREAM_MUSIC,aM.getStreamMaxVolume(AudioManager.STREAM_MUSIC),0);出於某種原因崩潰了應用程序。

關於如何使AudioManager每次都工作,以便打電話時揚聲器電話已打開且音量最大的任何建議?


編輯:即使一旦onCallStateChanged方法被調用設置speackphoneon爲真,但它仍然是不可靠的開啓揚聲器。該卷也是不可靠的,似乎無法將其設置爲最大值,而不會崩潰。

+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的體積。此代碼+增加呼叫流的音量將滿足您的要求。