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

前端 未结 5 602
夕颜
夕颜 2021-02-06 00:53

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 A

相关标签:
5条回答
  • 2021-02-06 00:55

    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.

    0 讨论(0)
  • 2021-02-06 00:58

    Audiomanager overrides and routes audio to the latest connected device(either wired headset or bluetooth headset). In android, we do not have any option to override this setting unless it is a system app and route the audio wherever we wish to route. However, you can use reflection apis and override this setting. Audiomanager suspends bluetooth connection route(if already connected)if wired headset is connected and vice versa. You can look at the code here.

    Hence using reflection apis you can toggle bluetooth audio route by invoking this method.

    0 讨论(0)
  • 2021-02-06 01:04

    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

    0 讨论(0)
  • 2021-02-06 01:09

    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

    0 讨论(0)
  • 2021-02-06 01:17

    You need to instantiate a new object of class MediaPlayer and use the following method on it

     amediaplayer.setAudioStreamType(AudioManager.STREAM_RING)
    

    Do not forget to check authorization to use bluetooth, you are unable to send anything to speaker via bluetooth without user privilege as you know.

    0 讨论(0)
提交回复
热议问题