我正在为 Android 编写一个 sip 应用程序。在通话期间,我必须记录麦克风输入并播放传入的音频。必须可以选择使用免提电话。它必须与 Android 1.5+(1.5、1.6、2.0、2.1、2.2、未来版本)兼容且设备便携。
好的。所以我使用 AudioTrack 播放传入的音频,使用 AudioRecord 记录来自麦克风的数据,使用 AudioManager.setSpeakerphoneOn() 来启用或禁用扬声器。
听起来很简单,但它并不像它应该的那么简单。除非调用 AudioManager.setMode(AudioManager.MODE_IN_CALL),否则 AudioManager.setSpeakerphoneOn(false) 不起作用。所以我必须在 MODE_IN_CALL 中。
仍然可以且简单,它适用于我的 G1 与 Android 1.6、旧三星手机、模拟器、我们的许多客户设备等。但它并不适用于任何地方:(
在三星平板电脑 GT-P1000 上,我得到 0,0,0,0,... 作为麦克风输入的流。我认为摩托罗拉手机也存在同样的问题(客户抱怨)。经过一番测试,我意识到这是由 AudioManager.setMode(AudioManager.MODE_IN_CALL) 引起的。这会导致麦克风在某些设备上不起作用。但我必须打电话给它,否则我无法禁用免提电话。
有没有一种简单的方法可以让它变得简单、正确和有效?如果可能的话,没有地狱之类的 Sipdroid 高度危险的源代码:
if (RtpStreamReceiver.samsung) {
AudioManager am = (AudioManager) Receiver.mContext.getSystemService(Context.AUDIO_SERVICE);
am.setMode(AudioManager.MODE_IN_CALL);
am.setMode(AudioManager.MODE_NORMAL);
}
或者
void initMode() {
samsung = Build.MODEL.contains("SAMSUNG") || Build.MODEL.contains("SPH-") ||
Build.MODEL.contains("SGH-") || Build.MODEL.contains("GT-");
if (Receiver.call_state == UserAgent.UA_STATE_INCOMING_CALL &&
(Receiver.pstn_state == null || Receiver.pstn_state.equals("IDLE"))) {
setMode(AudioManager.MODE_NORMAL);
}
非常感谢简