Android : Switching audio between Bluetooth and Phone Speaker is inconsistent
android, audio, bluetooth
Solution
I got the reason of inconsistent audio routing, it was because I was setting phone speaker false, also I was using inappropriate mode... below combination worked for me:
//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);
Android version: 4.3
Thanks!
Problem
My requirement is to switch audio between Bluetooth and phone speaker as per user selection. Below is the code snippet: ``` //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); ``` Issues: 1. I'm able to route audio but Behavior is inconsistent, sometimes it routes to phone speaker even if user choose to route to bluetooth(bluetooth is connected) 2. If audio is routed to phone speaker, volume becomes low(please don't say check the phone volume) 3. Only a few times I could observe audio routing is proper as per choice, if I repeat it becomes weird as I mentioned above. Android version: Jellybean 4.3 Has anyone faced something similar behavior ? Thanks!