不能使用麦克风

时间:2013-09-04 19:05:28

标签: android bluetooth audio-streaming voip headset

我正在开发一个VoIP应用程序。

在Galaxy Tab 4.0.4上使用蓝牙耳机时,我遇到以下问题:

当VOIP呼叫中间有语音呼叫时,或者当我停止应用程序并重启我的应用程序时,它将不再使用蓝牙耳机麦克风。

出现问题时,即使停止启动蓝牙适配器或蓝牙设备,也不会使用蓝牙耳机麦克风。只有adb reboot似乎可以解决这个问题。

有一个“脏”修复,我不完全理解:

当我的应用程序调用时出现问题:

  

audioManager.setMode(AudioManager.VOICE_CALL)

     

audioManager.setMode(AudioManager.NORMAL)

将重新启用蓝牙耳机的麦克风。

如果这个电话一直工作就足以解决这个问题,但是有一个问题:有时候(大约25%)在调用该片段之后我会在每次SCO时都开始听蓝牙耳机非常恼人的干扰启用

我猜他们与AudioManager文档中的以下注释有关: '特别是,MODE_IN_CALL模式只应在电话应用程序拨打电话时使用,因为它会导致来自无线电层的信号​​进入平台混音器。'

问题是:关于可能导致什么以及如何避免解释问题的任何想法??

1 个答案:

答案 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);