2017-06-07 89 views

回答

0

棘手的問題,尤其多臺設備的情況。
我曾在一個VoIP應用程序,這是我知道這一點。您所面對的可能是因爲在請求焦點後正在手動處理音頻管理器模式和/或流。您需要做的是將控制權轉移到通話流中,以便您的通話處於打開狀態時,連接和斷開耳機,轉接到電話聽筒等都由o.s.自動處理。

你也許可以做這一切或組合...

使用AudioManager {} .setMode(int mode) - 使用MODE_IN_COMMUNICATION,推薦用於VoIP或MODE_IN_CALL

此外,檢查STREAM_VOICE_CALL

你usinng - isSpeakerphoneOn() and setSpeakerphoneOn(boolean) - isBluetoothScoOn()setBluetoothScoOn(boolean)

將需要玩弄所有這些設備或耳機模型的具體問題。

有用的東西:

即使建立SCO連接,以下限制 適用於音頻輸出流,使他們能夠被路由到SCO 耳機:

  • 流類型必須是STREAM_VOICE_CALL
  • 格式必須是單聲道
  • 採樣必須是16kHz或8kHz
+0

感謝您的幫助,但我有一個問題,它將在切換到普通揚聲器之前留在揚聲器約1.5秒 –

+0

好吧..什麼音頻模式是你的應用程序在通話時? – user2450263

+0

我認爲MODE_IN_CALL是因爲這個應用程序使用Cordova通過人行橫道在webview中撥打電話,所以我不知道爲什麼延遲切換到普通揚聲器 –

0

要打開耳機編程試試這個:

audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

private void useEarpiece() { 
    audioManager.setMode(AudioManager.MODE_IN_CALL); 
    audioManager.setSpeakerphoneOn(false); 
} 

檢查您的權限:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 

爲了趕上事件:

private class HeadSetReceiver extends BroadcastReceiver { 
    @Override public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) { 
      int state = intent.getIntExtra("state", -1); 
      switch (state) { 
      case 0: 
       // Headset unplugged 
       break; 
      case 1: 
       // Headset plugged in 
       break; 
      } 
     } 
    } 
} 
+0

我嘗試了,但是當我切換到普通音箱將開關前留在外放1.5s左右正常揚聲器 –

+0

感謝這個兄弟! –