3

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

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

当 VOIP 通话过程中有语音通话时,或者当我停止应用程序并重新启动应用程序时,它不会再次使用蓝牙耳机麦克风。

当问题发生时,即使在停止和启动蓝牙适配器或蓝牙设备后,它也不会使用蓝牙耳机麦克风。只有 adb reboot 似乎可以解决问题。

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

当问题发生从我的应用程序调用时:

audioManager.setMode(AudioManager.VOICE_CALL)

audioManager.setMode(AudioManager.NORMAL)

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

如果此呼叫始终有效,则足以解决问题,但是有一个问题:有时(大约 25%)在呼叫片段后,每次启用 SCO 时,我都会开始在蓝牙耳机上收听非常烦人的干扰

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

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

4

1 回答 1

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);
于 2015-05-06T23:24:38.487 回答