扬声器出现呼叫工具包问题,接听电话后自动打开



我正在使用CallKitTokBox以及它如何处理一个错误,即接到电话后,扬声器变为活动状态,无法通过点击它来禁用。呼叫从活动扬声器开始,我认为这是一个错误,但是WhatsApp和FBMassenger在他们的自定义呼叫屏幕视图中使用了相同的功能,但是他们的扬声器在接到呼叫后变得不活动,我搜索了该呼叫,到目前为止还没有找到相关的答案。

TokBox,他们提供了OTDefaultAudioDevice.hOTDefaultAudioDevice.m文件,从中配置了所有关于音频的内容CallKitSpeakerBox.我在哪里找到以下配置:

#define AUDIO_DEVICE_HEADSET     @"AudioSessionManagerDevice_Headset"
#define AUDIO_DEVICE_BLUETOOTH   @"AudioSessionManagerDevice_Bluetooth"
#define AUDIO_DEVICE_SPEAKER     @"AudioSessionManagerDevice_Speaker"

其使用方式如下:

- (BOOL)configureAudioSessionWithDesiredAudioRoute:(NSString*)desiredAudioRoute
{
OT_AUDIO_DEBUG(@"configureAudioSessionWithDesiredAudioRoute %@",desiredAudioRoute);
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err;
//ios 8.0 complains about Deactivating an audio session that has running
// I/O. All I/O should be stopped or paused prior to deactivating the audio
// session. Looks like we can get away by not using the setActive call
if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"7.0")) {
// close down our current session...
[audioSession setActive:NO error:nil];
}
if ([AUDIO_DEVICE_BLUETOOTH isEqualToString:desiredAudioRoute]) {
[self setBluetoothAsPrefferedInputDevice];
}
if (SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"7.0")) {
// Set our session to active...
if (![audioSession setActive:YES error:&err]) {
NSLog(@"unable to set audio session active: %@", err);
return NO;
}
}
if ([AUDIO_DEVICE_SPEAKER isEqualToString:desiredAudioRoute]) {
// replace AudiosessionSetProperty (deprecated from iOS7) with
// AVAudioSession overrideOutputAudioPort
#if !(TARGET_OS_TV)
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&err];
#endif
} else
{
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone
error:&err];
}
return YES;
}

AVAudioSessionPortOverrideSpeaker用于所有设备的位置,我相信这是成为启用扬声器的主要原因,尽管我不太清楚。

if ([AUDIO_DEVICE_SPEAKER isEqualToString:desiredAudioRoute]) {
// replace AudiosessionSetProperty (deprecated from iOS7) with
// AVAudioSession overrideOutputAudioPort
#if !(TARGET_OS_TV)
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&err];
#endif
} else
{
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone
error:&err];
}
}

是否有人有任何建议,或者到目前为止,这里有人纠正了这种状态吗?

我也相信许多像我一样的人正在经历这个问题。

任何帮助都将是可观的。

谢谢

我已经浏览了 opentok 支持,他们认真对待这个问题,并且由于该服务仅用于视频聊天,因此他们使该扬声器在 CallKit UI 中启用。要使其禁用或仅使用其 Objective C 类(即OTDefaultAudioDevice.hOTDefaultAudioDevice.m(进行音频通话,那么我们必须在文件中注释以下行.m

audioOptions |= AVAudioSessionCategoryOptionDefaultToSpeaker;

希望它能挽救许多人的一天。

谢谢。

最后我设法解决了这个问题。解决方案是@AbhishekMitra和我发现自己的东西的混合

首先,我将 Objective C 类 OTDefaultAudioDevice 替换为 DefaultAudioDevice.swift可在此处找到: https://github.com/opentok/opentok-ios-sdk-samples-swift/blob/master/Custom-Audio-Driver/Custom-Audio-Driver/DefaultAudioDevice.swift

这相当于 objc 的行,注释掉 Abhishek 建议的行,并在同一函数中添加另一行,即:

configureAudioSessionWithDesiredAudioRoute(desiredAudioRoute: DefaultAudioDevice.kAudioDeviceHeadset)

这是整个功能

fileprivate func setupAudioSession() {
let session = AVAudioSession.sharedInstance()

previousAVAudioSessionCategory = session.category
avAudioSessionMode = session.mode
avAudioSessionPreffSampleRate = session.preferredSampleRate
avAudioSessionChannels = session.inputNumberOfChannels
do {
try session.setPreferredSampleRate(Double(DefaultAudioDevice.kSampleRate))
try session.setPreferredIOBufferDuration(0.01)
let audioOptions = AVAudioSessionCategoryOptions.mixWithOthers.rawValue |
AVAudioSessionCategoryOptions.allowBluetooth.rawValue
//|
//AVAudioSessionCategoryOptions.defaultToSpeaker.rawValue
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeVideoChat, options: AVAudioSessionCategoryOptions(rawValue: audioOptions))
setupListenerBlocks()
//set the audio to headset
configureAudioSessionWithDesiredAudioRoute(desiredAudioRoute: DefaultAudioDevice.kAudioDeviceHeadset)

try session.setActive(true)
} catch let err as NSError {
print("Error setting up audio session (err)")
} catch {
print("Error setting up audio session")
}
}

这最终解决了我的问题,当通话处于活动状态时,设备不在扬声器上。如果您有任何问题,请告诉我。

此行的 objc 版本将是:

[self configureAudioSessionWithDesiredAudioRoute:
AUDIO_DEVICE_HEADSET];

最新更新