Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to play audio through Bluetooth speaker even when headset is plugged in?

I have my phone connected to a Bluetooth speaker and the headphones plugged in. Now I'd like to play audio through the Bluetooth speaker. When I set the audio stream to AudioManager.STREAM_MUSIC it just plays over the headphones.

It doesn't matter if it plays on the headphones as well but I need it to play on the Bluetooth speaker.

How is this possible? The app SoundAbout manages to do that so there must be a way.

EDIT: When I plug in the headphones and only afterwards connect to the Bluetooth speakers all audio plays through the Bluetooth speakers which I want. But I can't expect the user to find that out and before having to show them a complicated message I'd rather find out a way to make the sound always play through BT speakers when connected to some.

Thanks

(Note this is not the same question as this: How to Play audio through speaker even when headset is plugged in? I want it to play on Bluetooth speakers, not on the integrated speaker of the phone.)

like image 836
DominicM Avatar asked Mar 01 '17 11:03

DominicM


People also ask

How do I play audio simultaneously in both speakers and headphones at the same time in an Android phone?

Android users need to go to Bluetooth Settings and pair either Bluetooth headphones or speakers one by one. Once connected, tap the three-dot icon on the right and click on Advanced Settings. Toggle on the 'dual audio' option if not already turned on. This should enable users to connect to two devices at once.


3 Answers

Solution

Suppose you already tested STREAM_RING on your new instance of media player and not directly setting stream type, and it didn't work out, You need a correct profile for your bluetooth device.

Take a look at this article Read the "Implementing HAL" section, there is alot of source for different profile that you may be able to use.

There is also an easy solution which is to change your device profile to HEADSET in your getServiceConnected() method, it will turn into a Stay connected device but the output will become mono! As I recall, Which is a shame for speakers, A2DP also may not be supported in some hardwares and still interrupted by wire headsets.

I suggest to create a new profile and use it, a little bit tricky working with HAL but will worth it,

Sorry that I can not provide a source code for you at the moment.

like image 188
Iman Avatar answered Nov 09 '22 18:11

Iman


Bluetooth connection may work with below state is true . After receive BluetoothA2dp.STATE_CONNECTED, you can play music as normal.

Java Code Examples for android.bluetooth.BluetoothA2dp.STATE_CONNECTED

public BluetoothHandsfree(Context context, CallManager cm) {
    mCM = cm;
    mContext = context;
    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
    boolean bluetoothCapable = (adapter != null);
    mHeadset = null;  // nothing connected yet
    mA2dp = new BluetoothA2dp(mContext);
    mA2dpState = BluetoothA2dp.STATE_DISCONNECTED;
    mA2dpDevice = null;
    mA2dpSuspended = false;

    mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    mStartCallWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                                   TAG + ":StartCall");
    mStartCallWakeLock.setReferenceCounted(false);
    mStartVoiceRecognitionWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                                                   TAG + ":VoiceRecognition");
    mStartVoiceRecognitionWakeLock.setReferenceCounted(false);

    mLocalBrsf = BRSF_AG_THREE_WAY_CALLING |
                 BRSF_AG_EC_NR |
                 BRSF_AG_REJECT_CALL |
                 BRSF_AG_ENHANCED_CALL_STATUS;

    if (sVoiceCommandIntent == null) {
        sVoiceCommandIntent = new Intent(Intent.ACTION_VOICE_COMMAND);
        sVoiceCommandIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
    if (mContext.getPackageManager().resolveActivity(sVoiceCommandIntent, 0) != null &&
            BluetoothHeadset.isBluetoothVoiceDialingEnabled(mContext)) {
        mLocalBrsf |= BRSF_AG_VOICE_RECOG;
    }

    mBluetoothPhoneState = new BluetoothPhoneState();
    mUserWantsAudio = true;
    mPhonebook = new BluetoothAtPhonebook(mContext, this);
    mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    cdmaSetSecondCallState(false);

    if (bluetoothCapable) {
        resetAtState();
    }

}

please find below links : with sample codes it may help you.

Java Code Examples for android.bluetooth.BluetoothHeadset

Programmatically connect to paired Bluetooth speaker and play audio

like image 38
Chetan Joshi Avatar answered Nov 09 '22 20:11

Chetan Joshi


If you have your routing logic within your application then based on that you can decide on which output the audio to be played.

I have a test app written for the exact purpose. My Github Link

You can also route audio as you want based on a requirement.You can refer this github link for routing

like image 22
Saurav Avatar answered Nov 09 '22 19:11

Saurav