【发布时间】:2018-05-02 10:27:51
【问题描述】:
我正在使用CallKit 和TokBox 以及它如何处理一个错误,即在接到电话后,扬声器变为活动状态并且无法通过点击它来禁用它。通话是从活跃的扬声器开始的,我认为这是一个错误,但 WhatsApp 和 FBMassenger 在他们的自定义呼叫屏幕视图中使用了相同的方法,但是他们的扬声器在接到电话后变得不活跃,我搜索了它并且没有找到相关的答案所以远。
在TokBox 中,他们提供了OTDefaultAudioDevice.h 和OTDefaultAudioDevice.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];
}
}
到目前为止,有没有人有任何建议或任何人已经纠正了这种状态?
我也相信很多像我一样的人正在经历这个问题。
任何帮助都将不胜感激。
谢谢
【问题讨论】:
-
如果我正确理解了您的问题,您正在尝试在接听电话时禁用音频。如果是这样的话,接听电话就应该激活扬声器不是常识吗?如果用户没有准备好,他们就不会接受。你怎么看? @Abhishek Mitra
-
@LucasHuang 感谢您的回复,我面临的是,当接收器接到电话时,扬声器变为活动状态(在响亮模式下)并且通过录音,它不会变得无法听。接听电话时,扬声器不应大声。
-
当您说扬声器时,您指的是物理扬声器吗?那么,您不能通过点击扬声器上的静音按钮来静音吗?我也不明白你所说的响亮模式。你能详细说明一下吗?
-
@LucasHuang 感谢您对我的问题感到好奇,我将发布一个屏幕截图,希望您现在能明白。图片链接:ibb.co/nnX91J
-
@AbhishekMitra 您找到解决此问题的方法了吗?我有同样的问题
标签: ios swift avaudiosession tokbox callkit