2017-03-01 186 views
9

我有我的手机连接到蓝牙扬声器和插上耳机。现在,我想通过蓝牙扬声器播放音频。 当我将音频流设置为AudioManager.STREAM_MUSIC时,它只是通过耳机播放。即使耳机插入,如何通过蓝牙扬声器播放音频?

如果它播放的耳机也不要紧,但我需要它的蓝牙扬声器播放。

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

编辑:当我插入耳机,只有后来连接蓝牙扬声器,所有音频播放通过蓝牙扬声器,我想要的。但我不能指望用户发现,并有向他们展示一个复杂的消息,我宁愿找到出路,使声音在连接到一些通过BT音箱总是打之前。

感谢

(请注意,这是不一样的问题,因为这:How to Play audio through speaker even when headset is plugged in? 我希望它在蓝牙扬声器播放,而不是手机的集成扬声器)

+0

我不认为这是可能的,因为android一次只能输出一种输出方式。如果万一你发现有什么东西让我起来......! –

+0

我只需要蓝牙扬声器,这将是一种方法。但有时它实际上可以两种方式工作,例如当你设置音频流AudioManager.STREAM_RING,并有一个蓝牙扬声器连接音频播放通过手机的扬声器和通过蓝牙扬声器(但是,当你插入一个耳机,它不再播放蓝牙扬声器,我需要) – DominicM

+0

一个非常基本的问题:为什么不能使用audiomanager apis通过bt扬声器路由音频?它不工作?我认为使用startBluetoothSco()通过bt强制音频很简单。我没有尝试过,但检查是否有使用此问题。 – manishg

回答

6

解决方案

假设你已经在你的新的媒体播放器的实例测试STREAM_RING,而不是直接设置流类型,它没有工作,你需要为你的蓝牙设备正确的个人资料。

看看this article 阅读“实施HAL”部分,有许多不同配置文件的源代码可供您使用。

也有一个简单的解决办法是改变你的设备配置文件在你的getServiceConnected到耳机()方法时,它会变成一个保持连接的设备,但输出将变为单声道!据我所知,对于扬声器来说这是一种耻辱,A2DP在某些硬件中也可能不被支持,并且仍然被有线耳机中断。

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

对不起,我不能给你的那一刻提供源代码。

+0

请您创建一个示例源代码? – Imzich

+0

@Imzich我几年没有为android编写任何代码,但我会尽快提供一个样本。 – Zich

+0

使用STREAM_RING时,声音会通过蓝牙扬声器播放,但也可以通过手机的内置扬声器播放,这并不是我想要的。我没有写任何蓝牙代码,因为我希望用户能够通过操作系统连接到BT。当我没有插入耳机时,音频通过BT播放,所以蓝牙输出工作,这不是问题。还是我误解了一些东西? – DominicM

1

您需要实例类的MediaPlayer的一个新对象,并使用下面的方法就可以了

amediaplayer.setAudioStreamType(AudioManager.STREAM_RING) 

不要忘记检查授权使用蓝牙,您将无法通过蓝牙发送任何扬声器,无需用户你知道的特权。

+1

随着STREAM_RING音频播放在蓝牙扬声器和手机的内部扬声器。蓝牙输出可以和STREAM_MUSIC一起工作,所以这不是问题,但插入耳机后,它会通过耳机而不是蓝牙扬声器播放。 – DominicM

2

蓝牙连接可以与下面的状态是真实的工作。 收到BluetoothA2dp.STATE_CONNECTED后,您可以正常播放音乐。

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(); 
    } 

} 

Java代码示例,请看看下面的链接:与示例代码,它可以帮助你。

Java Code Examples for android.bluetooth.BluetoothHeadset

Programmatically connect to paired Bluetooth speaker and play audio

0

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

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

相关问题