使用AudioManager会干扰呼叫音频

时间:2014-10-16 14:19:17

标签: android android-audiomanager speakerphone

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

2 个答案:

答案 0 :(得分:2)

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

audioManager.setMode(AudioManager.MODE_IN_CALL);

我曾经使用过这种方法,因为如果没有它我就无法成功使用扬声器设置(我发现在另一个Stack Overflow应答中设置模式的建议......它有效,但会产生问题后果)。

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

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

答案 1 :(得分:1)

首先,我将从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

会很有帮助