使用AudioManager会干扰通话音频

11

我在一个广播接收器(电话状态监听器)中使用以下代码来启用扬声器:

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上进行测试。

2个回答

2
我已经解决了这个问题。似乎导致我的音频出现问题的代码是这一行:
audioManager.setMode(AudioManager.MODE_IN_CALL);

我使用这种方法是因为我无法成功启用扬声器设置而不使用它(我在另一个Stack Overflow答案中找到了一个建议来设置模式...它起作用了,但有问题的后果)。

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

我还保持了对AudioManager的静态引用,如此答案中建议的那样。 在这种特定情况下似乎不必要,但安全起见最好保留。


1
首先,我将从setMode的文档中复制此文本,以确保您考虑到它:
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。
了解您的应用程序是否实际上替换了平台范围内的音频设置管理或主要电话应用程序将非常有帮助。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接