首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能用麦克风

不能用麦克风
EN

Stack Overflow用户
提问于 2013-09-04 19:05:28
回答 1查看 2K关注 0票数 3

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

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

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

当出现问题时,即使在停止和启动蓝牙适配器或蓝牙设备之后,也不会继续使用蓝牙耳机、麦克风。似乎只有亚行重启才能解决问题。

有一个“肮脏”的解决办法,我不完全理解:

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

audioManager.setMode(AudioManager.VOICE_CALL) audioManager.setMode(AudioManager.NORMAL)

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

如果这个呼叫总是有效的话,那就足以解决这个问题了,但是有一个问题:有时(大约25%)在调用代码片段之后,我会在每次SCO启用时,开始监听蓝牙耳机上非常恼人的干扰。

我想它们与AudioManager文档中的以下评论有关:“特别是,只有在电话应用程序打电话时才能使用MODE_IN_CALL模式,因为它会导致来自无线电层的信号给平台混频器供电。”

问题是:对于什么可能导致和如何避免被解释的问题,有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-05-06 23:24:38

我遇到了类似的事情。在铃声窃取了应用程序的音频焦点后,音频质量下降了。

如果您能够访问API 11,我建议使用audioManager.setMode(MODE_IN_COMMUNICATION),因为这是用于VoIP调用的。这本身就会提高你的音频质量。有了MODE_NORMAL,您可能会听到MODE_IN_COMMUNICATION没有的反馈。

如果这还不够,尝试重新建立音频当你的应用程序恢复音频焦点。当我这样做的时候,我控制服务中的音频,这样活动生命周期不会影响它,但是音频焦点仍然需要被关注,因为像铃声和语音呼叫之类的东西会影响它。由于您提到过后台应用程序会损害音频,我建议将音频管理转移到服务中,或者在onResume()中重新建立蓝牙连接。或者你的onResume()正在覆盖什么东西。没有代码示例是很难判断的。

如果您没有音频焦点监听器(API级别8),您可以这样设置一个:

代码语言:javascript
复制
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()期间,需要在某个地方设置侦听器:

代码语言:javascript
复制
final AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
am.requestAudioFocus(afChangeListener, AudioManager.STREAM_VOICE_CALL,
                                 AudioManager.AUDIOFOCUS_GAIN);

当您完成调用时,不要忘记取消此侦听器的注册。

代码语言:javascript
复制
am.abandonAudioFocus(afChangeListener);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18621804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档