我有一个语音聊天应用程序,工作得很好。目前我正在尝试使应用程序支持蓝牙耳机以防任何连接。我需要处理两种情况:
对于第一种情况,应用程序应自动开始使用耳机作为其默认输入/输出音频设备。另一方面,应用程序在耳机连接到设备时,应从当前输入/输出音频设备切换到蓝牙耳机。
我能够使用以下代码成功处理第一个案例:
mAudioManager.setMode(0);
mAudioManager.startBluetoothSco();
mAudioManager.setBluetoothScoOn(true);
mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);
至于第二种情况,我创建了一个BroadcastReciever
,当蓝牙耳机连接时监听如下:
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
mAudioManager.setMode(0);
mAudioManager.startBluetoothSco();
mAudioManager.setBluetoothScoOn(true);
mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);
} else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
mAudioManager.setMode(0);
mAudioManager.startBluetoothSco();
mAudioManager.setBluetoothScoOn(false);
mAudioManager.setMode(android.media.AudioManager.MODE_IN_CALL);
}
}
};
BroadcastReciever
能够检测到耳机连接/断开,并且呼叫将声音指向耳机而不是手机的耳机。问题是应用程序一直使用设备的麦克风作为输入音频设备而不是耳机。经过长时间的检查,我意识到当BroadcastReciever
收到连接耳机的通知时,我需要稍等一下才能调用mAudioManager.startBluetoothSco();
让应用程序使用耳机的麦克风。
问题是,在知道蓝牙耳机已连接后,我应该听什么样的事件,以便我可以从耳机的麦克风开始捕捉声音?
事实证明我不应该听BluetoothDevice.ACTION_ACL_CONNECTED
,而应该考虑的是BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED
。 BroadcastReciever
应初始化如下:
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {
int state = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, -1);
boolean result = state == BluetoothHeadset.STATE_CONNECTED;
mCallback.onConnected(result);
}
}
};