即使插入耳机,如何通过蓝牙扬声器播放音频?

时间:2017-03-01 11:16:55

标签: android audio bluetooth

我将手机连接到蓝牙扬声器并插入耳机。现在我想通过蓝牙扬声器播放音频。 当我将音频流设置为AudioManager.STREAM_MUSIC时,它只会通过耳机播放。

如果它在耳机上播放也没关系,但我需要它在蓝牙扬声器上播放。

这怎么可能?应用程序SoundAbout设法做到这一点,所以必须有办法。

编辑:当我插入耳机时,只有在连接到蓝牙扬声器后,所有音频都通过我想要的蓝牙扬声器播放。 但我不能指望用户要找到它并且在向他们展示一个复杂的消息之前我宁愿找到一种方法来使声音在连接到某些人时始终通过BT扬声器播放。

由于

(注意这不是同一个问题:How to Play audio through speaker even when headset is plugged in? 我想让它在蓝牙音箱上播放,而不是在手机的集成扬声器上播放。)

5 个答案:

答案 0 :(得分:6)

<强>解决方案

假设您已经在新的媒体播放器实例上测试了STREAM_RING而没有直接设置流类型,并且它没有成功,您需要一个正确的蓝牙设备配置文件。

看看this article 阅读&#34;实施HAL&#34;部分,您可以使用不同的配置文件的很多来源。

还有一个简单的解决方案是将您的设备配置文件更改为getServiceConnected()方法中的HEADSET,它将变为保持连接设备,但输出将变为单声道!我记得,对于扬声器来说这是一个耻辱,A2DP在一些硬件中也可能不受支持,但仍然被有线耳机打断。

我建议创建一个新的配置文件并使用它,使用HAL有点棘手,但值得,

很抱歉,我暂时无法为您提供源代码。

答案 1 :(得分:2)

蓝牙连接可能与以下状态一致。 收到BluetoothA2dp.STATE_CONNECTED后,您可以正常播放音乐。

android.bluetooth.BluetoothA2dp.STATE_CONNECTED

的Java代码示例
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();
    }

}

请在下面找到链接:使用示例代码可以帮助您。

Java Code Examples for android.bluetooth.BluetoothHeadset

Programmatically connect to paired Bluetooth speaker and play audio

答案 2 :(得分:2)

如果您的应用程序中有路由逻辑,那么您可以根据该逻辑决定要播放音频的输出。

我有一个针对确切目的编写的测试应用程序。 My Github Link

您还可以根据需要路由音频。You can refer this github link for routing

答案 3 :(得分:1)

您需要实例化MediaPlayer类的新对象并在其上使用以下方法

 amediaplayer.setAudioStreamType(AudioManager.STREAM_RING)

不要忘记检查使用蓝牙的授权,如果没有用户权限,你无法通过蓝牙向扬声器发送任何信息。

答案 4 :(得分:0)

Audiomanager会将音频覆盖并路由到最新连接的设备(有线耳机或蓝牙耳机)。在android中,我们没有任何选项可以覆盖此设置,除非它是一个系统应用程序并将音频路由到我们希望路由的任何位置。但是,您可以使用反射apis并覆盖此设置。如果连接了有线耳机,Audiomanager将暂停蓝牙连接路由(如果已连接),反之亦然。您可以查看代码here

因此,使用反射apis,您可以通过调用此method来切换蓝牙音频路径。