[英]How to play audio through Bluetooth speaker even when headset is plugged in?
我将手机连接到蓝牙扬声器并插入了耳机。现在我想通过蓝牙扬声器播放音频。 当我将音频流设置为AudioManager.STREAM_MUSIC
它只是通过耳机播放。
它是否在耳机上播放并不重要,但我需要它在蓝牙扬声器上播放。
这怎么可能? 应用程序SoundAbout设法做到这一点,所以必须有一种方法。
编辑:当我插入耳机后,只有连接到蓝牙扬声器后,所有音频都通过我想要的蓝牙扬声器播放。 但是我不能指望用户找到它并且在向他们展示一个复杂的消息之前我宁愿找到一种方法来使声音在连接到某些时始终通过BT扬声器播放。
谢谢
(请注意,这与以下问题不同: 即使插入耳机,如何通过扬声器播放音频?我希望它能够在蓝牙扬声器上播放,而不是在手机的集成扬声器上播放。)
解
假设您已经在新的媒体播放器实例上测试了STREAM_RING而没有直接设置流类型,并且它没有用完,您需要一个正确的蓝牙设备配置文件。
看看这篇文章阅读“实施HAL”部分,您可以使用不同的配置文件的很多来源。
还有一个简单的解决方案是将您的设备配置文件更改为getServiceConnected()方法中的HEADSET,它将变为保持连接设备,但输出将变为单声道! 我记得,对于扬声器来说这是一个耻辱,A2DP也可能在某些硬件中不受支持,但仍然被有线耳机打断。
我建议创建一个新的配置文件并使用它,使用HAL有点棘手,但值得,
很抱歉,我暂时无法为您提供源代码。
蓝牙连接可能与以下状态一致。 收到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();
}
}
请查看以下链接:使用示例代码可以帮助您。
如果您的应用程序中有路由逻辑,那么您可以根据该逻辑决定要播放音频的输出。
我有一个针对确切目的编写的测试应用程序。 我的Github链接
您还可以根据需要根据需要路由音频。 您可以参考此github链接进行路由
您需要实例化MediaPlayer类的新对象,并在其上使用以下方法
amediaplayer.setAudioStreamType(AudioManager.STREAM_RING)
不要忘记检查使用蓝牙的授权,如果没有用户权限,您无法通过蓝牙向扬声器发送任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.