2014-03-31 3 views
1

필자의 요구 사항은 사용자 선택에 따라 블루투스와 전화 스피커간에 오디오를 전환하는 것입니다.Android : 블루투스와 전화 스피커 간의 오디오 스위칭이 일치하지 않습니다.

//AudioTrack for incoming audio to play as below: 

    int mMaxJitter = AudioTrack.getMinBufferSize(8000,    AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT);         
    new AudioTrack(AudioManager.STREAM_VOICE_CALL,8000, 
      AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 
      mMaxJitter, AudioTrack.MODE_STREAM); 


//To register broadcast receiver for bluetooth audio routing 
    IntentFilter ifil = new IntentFilter(); 
    ifil.addAction(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED); 
    this.registerReceiver(<receiver instance>,ifil); 

//To get AudioManager service 
    AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

//Whenever user select to route audio to Bluetooth 
    mAudioManager.setMode(AudioManager.MODE_IN_CALL);//tried setting with other mode also viz. MODE_NORMAL, MODE_IN_COMMUNICATION but no luck 
    mAudioManager.startBluetoothSco();//after this I get AudioManager.SCO_AUDIO_STATE_CONNECTED state in the receiver 
    mAudioManager.setBluetoothScoOn(true); 
    mAudioManager.setSpeakerphoneOn(false); 

//Whenever user select to route audio to Phone Speaker 
    mAudioManager.setMode(AudioManager.MODE_NORMAL); 
    mAudioManager.stopBluetoothSco();//after this I get  AudioManager.SCO_AUDIO_STATE_DISCONNECTED state in the receiver 
    mAudioManager.setBluetoothScoOn(false); 
    mAudioManager.setSpeakerphoneOn(true); 

문제 : 아래는 코드입니다 경로 오디오에 내가 수 있어요 1.하지만 행동은 일관성이 때때로 사용자가 블루투스 경로를 선택할 경우에도 전화 스피커 경로 (블루투스가 연결되어) 2. 오디오가 전화 스피커로 라우팅되면 볼륨이 낮아집니다 (전화 볼륨을 확인하지 마십시오) 3. 오디오 라우팅을 관찰 할 수있는 유일한 시간은 선택에 따라 적절합니다. 나는 위에서 언급했다.

안드로이드 버전 : 젤리 빈은

4.3 사람이 뭔가 비슷한 동작에 직면 했습니까?

감사합니다.

답변

8

나는 일관성 오디오 라우팅의 이유를 가지고, 내가 조합 아래 이 나를 위해 일한 ... 또한 내가 부적절 모드를 사용하고, 전화 스피커가 false로 설정 되었기 때문에이었다 :

//For BT 
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); 
mAudioManager.startBluetoothSco(); 
mAudioManager.setBluetoothScoOn(true); 

//For phone ear piece 
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); 
mAudioManager.stopBluetoothSco(); 
mAudioManager.setBluetoothScoOn(false); 
mAudioManager.setSpeakerphoneOn(false); 

//For phone speaker(loadspeaker) 
mAudioManager.setMode(AudioManager.MODE_NORMAL); 
mAudioManager.stopBluetoothSco(); 
mAudioManager.setBluetoothScoOn(false); 
mAudioManager.setSpeakerphoneOn(true); 

안드로이드 버전 : 4.3

감사합니다.

+1

나는 스피커를 들어, 내가 MODE_NORMAL''로 변경 한 것으로 나타 BT로부터 온 것이면, 그렇지 않으면'MODE_IN_COMMUNICATION' – behelit

0

여전히이 내 솔루션을 다른 사람과 관련이있는 경우 :

public class AudioSourceUtil { 

private static void reset(AudioManager audioManager) { 
    if (audioManager != null) { 
     audioManager.setMode(AudioManager.MODE_NORMAL); 
     audioManager.stopBluetoothSco(); 
     audioManager.setBluetoothScoOn(false); 
     audioManager.setSpeakerphoneOn(false); 
     audioManager.setWiredHeadsetOn(false); 
    } 
} 

public static void connectEarpiece(AudioManager audioManager) { 
    reset(audioManager); 
    audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); 
} 

public static void connectSpeaker(AudioManager audioManager) { 
    reset(audioManager); 
    audioManager.setSpeakerphoneOn(true); 
} 

public static void connectHeadphones(AudioManager audioManager) { 
    reset(audioManager); 
    audioManager.setWiredHeadsetOn(true); 
} 

public static void connectBluetooth(AudioManager audioManager) { 
    reset(audioManager); 
} 

}

그리고 대한 (안드로이드 버전 6.0.1와 삼성 S7 SM-g9307에서 테스트) (탭 레이아웃 탭) 버튼을 클릭하여 사용은 :

/** 
* There are 3 scenarios for the audio source: 
* 1. No headphones and no bluetooth device: toggle phone/ speaker 
* 2. Headphones connected: toggle headphones/ speaker 
* 3. Bluetooth connected: toggle phone/ speaker/ bluetooth 
* 
* @param tab 
*/ 
private void handleTabAudioSourceClick(TabLayout.Tab tab) { 
    View view = tab.getCustomView(); 
    ImageView icon = (ImageView) view.findViewById(R.id.imageViewIcon); 
    int currentAudioSourceIdentifier = (Integer) view.getTag(); 

    if (audioManager.isWiredHeadsetOn() == false && BluetoothManager.isBluetoothHeadsetConnected() == false) { 
     // No headphones and no bluetooth device: toggle phone/ speaker. 
     if (currentAudioSourceIdentifier == R.drawable.tab_speaker) { 
      // Current audio source is earpiece, moving to speaker. 
      view.setTag(android.R.drawable.stat_sys_speakerphone); 
      icon.setImageResource(android.R.drawable.stat_sys_speakerphone); 
      AudioSourceUtil.connectSpeaker(audioManager); 
     } else { 
      // Current audio source is speaker, moving to earpiece. 
      view.setTag(R.drawable.tab_speaker); 
      icon.setImageResource(R.drawable.tab_speaker); 
      AudioSourceUtil.connectEarpiece(audioManager); 
     } 
    } else if (audioManager.isWiredHeadsetOn()) { 
     // Headphones connected: toggle headphones/ speaker. 
     if (currentAudioSourceIdentifier == android.R.drawable.stat_sys_speakerphone) { 
      // Current audio source is speaker, moving to headphones. 
      view.setTag(android.R.drawable.stat_sys_headset); 
      icon.setImageResource(android.R.drawable.stat_sys_headset); 
      AudioSourceUtil.connectHeadphones(audioManager); 
     } else { 
      // Current audio source is headphones, moving to speaker. 
      view.setTag(android.R.drawable.stat_sys_speakerphone); 
      icon.setImageResource(android.R.drawable.stat_sys_speakerphone); 
      AudioSourceUtil.connectSpeaker(audioManager); 
     } 
    } else if (BluetoothManager.isBluetoothHeadsetConnected()) { 
     // Bluetooth connected: toggle phone/ speaker/ bluetooth. 
     if (currentAudioSourceIdentifier == R.drawable.tab_speaker) { 
      // Current audio source is earpiece, moving to speaker. 
      view.setTag(android.R.drawable.stat_sys_speakerphone); 
      icon.setImageResource(android.R.drawable.stat_sys_speakerphone); 
      AudioSourceUtil.connectSpeaker(audioManager); 
     } else if (currentAudioSourceIdentifier == android.R.drawable.stat_sys_speakerphone) { 
      // Current audio source is speaker, moving to bluetooth. 
      view.setTag(android.R.drawable.stat_sys_data_bluetooth); 
      icon.setImageResource(android.R.drawable.stat_sys_data_bluetooth); 
      AudioSourceUtil.connectBluetooth(audioManager); 
     } else { 
      // Current audio source is bluetooth, moving to earpiece. 
      view.setTag(R.drawable.tab_speaker); 
      icon.setImageResource(R.drawable.tab_speaker); 
      AudioSourceUtil.connectEarpiece(audioManager); 
     } 
    } 
} 
관련 문제