使用 AudioManager 会干扰通话音频

Posted

技术标签:

【中文标题】使用 AudioManager 会干扰通话音频【英文标题】:Using AudioManager interferes with call audio 【发布时间】:2014-12-11 22:59:21 【问题描述】:

我在 BroadcastReceiver(电话状态监听器)中使用以下代码来启用扬声器:

final Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() 
    @Override
    public void run() 
        AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
        audioManager.setMode(AudioManager.MODE_IN_CALL);
        audioManager.setSpeakerphoneOn(true);
    
, 500);

当通过我的应用发起新的拨出电话时会发生这种情况。通话断开时,我关闭免提:

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(false);

这一切似乎都很好......第一次。之后,我手机的音频流似乎陷入了混乱。随后的调用出奇地无声,即使是从我的应用程序代码之外的调用(上面的设置没有被触发)。我似乎可以随机收到回叫音频,但我不确定是什么原因导致它返回。

关于我可能做错的任何想法?是否有我不知道的 android 错误?如何避免在后续通话中静音?

编辑:我正在 Galaxy S4 上进行测试。

【问题讨论】:

【参考方案1】:

我已经解决了这个问题。似乎搞砸了我的音频的代码是这一行:

audioManager.setMode(AudioManager.MODE_IN_CALL);

我使用了这种方法,因为没有它我无法让扬声器设置成功参与(我发现了在另一个 Stack Overflow 答案中设置模式的建议......它有效,但产生了问题)。

我真正需要做的就是删除这一行并将处理程序延迟从500 增加到2000

我还按照this answer 中的建议维护了对 AudioManager 的静态引用。在这种特殊情况下似乎没有必要,但比抱歉更安全。

【讨论】:

【参考方案2】:

首先,我将从 setMode 的 documentation 复制此文本,以确保您已将其考虑在内:

The audio mode encompasses audio routing AND the behavior of the telephony layer.
Therefore this method should only be used by applications that replace the platform-wide 
management of audio settings or the main telephony application

换句话说,只有系统上的应用程序才应该玩弄这种方法。如果不这样做,则无法保证一致性。

然后我会检查您的不同音频流,以防您的某些音频流太低(STREAM_VOICE_CALL、STREAM_SYSTEM、STREAM_RING、STREAM_MUSIC 或 STREAM_ALARM)。也许尝试使用setStreamMute 而不是 setSpeakerphoneOn。

了解您的应用程序是否实际上正在替换 the platform-wide management of audio settings or the main telephony application 会很有帮助

【讨论】:

感谢您的回答。虽然我最终解决了自己的问题,但您的回答促使我朝着正确的方向前进。干得好。

以上是关于使用 AudioManager 会干扰通话音频的主要内容,如果未能解决你的问题,请参考以下文章

Android开发之AudioManager(音频管理器)具体解释

au为啥加载音频错误

免提通话期间通过电话扬声器播放声音

来电后蓝牙 SCO 失败

使用融云SDK在APICloud平台实现单人多人音频通话

Audiomanager 和 MediaPlayer 的区别