我正在开发一个VoIP应用程序。
在Galaxy Tab 4.0.4上使用蓝牙耳机时,我遇到以下问题:
当VOIP呼叫中间有语音呼叫时,或者当我停止应用程序并重启我的应用程序时,它将不再使用蓝牙耳机麦克风。
出现问题时,即使停止启动蓝牙适配器或蓝牙设备,也不会使用蓝牙耳机麦克风。只有adb reboot似乎可以解决这个问题。
有一个“脏”修复,我不完全理解:
当我的应用程序调用时出现问题:
audioManager.setMode(AudioManager.VOICE_CALL)
audioManager.setMode(AudioManager.NORMAL)
将重新启用蓝牙耳机的麦克风。
如果这个电话一直工作就足以解决这个问题,但是有一个问题:有时候(大约25%)在调用该片段之后我会在每次SCO时都开始听蓝牙耳机非常恼人的干扰启用
我猜他们与AudioManager文档中的以下注释有关: '特别是,MODE_IN_CALL模式只应在电话应用程序拨打电话时使用,因为它会导致来自无线电层的信号进入平台混音器。'
问题是:关于可能导致什么以及如何避免解释问题的任何想法??
答案 0 :(得分:0)
如果您有权访问API级别11,我建议使用audioManager.setMode(MODE_IN_COMMUNICATION)
,因为那是用于VoIP呼叫的。仅此一项就可以改善您的音质。使用MODE_NORMAL
,您可能会听到MODE_IN_COMMUNICATION
不会反映的反馈。
如果这还不够,请在应用重新获得音频焦点时尝试重新建立音频。当我这样做时,我控制了服务中的音频,以便活动生命周期不会影响它,但音频焦点仍需要注意,因为铃声和语音呼叫之类的东西会影响它。既然你提到应用程序的背景会伤害音频,我建议将音频管理转移到服务,或者在onResume()
中重新建立蓝牙连接。或许你的onResume()
覆盖了某些东西。没有代码示例很难分辨。
如果您没有音频焦点监听器(API级别8),您可以像这样设置一个:
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
am.setMode(MODE_IN_COMMUNICATION);
//reestablish your bluetooth here, like you did originally
}
}
};
在您的VoIP通话开始时或在onCreate()期间,需要在某处设置监听器:
final AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
am.requestAudioFocus(afChangeListener, AudioManager.STREAM_VOICE_CALL,
AudioManager.AUDIOFOCUS_GAIN);
完成通话后,请不要忘记取消注册此侦听器。
am.abandonAudioFocus(afChangeListener);