我正在开发一个VoIP应用程序。
在Galaxy 4.0.4上使用蓝牙耳机时,我有以下问题:
当VOIP呼叫中间有语音呼叫时,或者当我停止应用程序并重新启动应用程序时,它将不再使用蓝牙耳机麦克风。
当出现问题时,即使在停止和启动蓝牙适配器或蓝牙设备之后,也不会继续使用蓝牙耳机、麦克风。似乎只有亚行重启才能解决问题。
有一个“肮脏”的解决办法,我不完全理解:
当问题发生时,从我的应用程序调用:
audioManager.setMode(AudioManager.VOICE_CALL) audioManager.setMode(AudioManager.NORMAL)
将重新启用蓝牙耳机的麦克风。
如果这个呼叫总是有效的话,那就足以解决这个问题了,但是有一个问题:有时(大约25%)在调用代码片段之后,我会在每次SCO启用时,开始监听蓝牙耳机上非常恼人的干扰。
我想它们与AudioManager文档中的以下评论有关:“特别是,只有在电话应用程序打电话时才能使用MODE_IN_CALL模式,因为它会导致来自无线电层的信号给平台混频器供电。”
问题是:对于什么可能导致和如何避免被解释的问题,有什么想法吗?
发布于 2015-05-06 23:24:38
我遇到了类似的事情。在铃声窃取了应用程序的音频焦点后,音频质量下降了。
如果您能够访问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);https://stackoverflow.com/questions/18621804
复制相似问题