有线耳机是否已插入? iOS12

时间:2018-12-05 03:59:01

标签: ios iphone core-audio avaudiosession

默认情况下,我们的应用使用扬声器进行音频输出。但是,我们还需要向用户显示有线耳机是否可用(在应用程序生命周期内甚至在应用程序启动之前就已插入)。因此。我们需要检测当前是否插入了有线耳机。我们可以将耳机与iPhone通话等配合使用,并且耳机符号在iPhone上可见,以确保耳机可以正常工作并被iPhone检测到。

我们正在使用以下代码,这些代码已经在各种线程(here)和博客中进行了充分讨论和建议,但是如果扬声器为ON,则在iOS 12中将不再起作用。

- (BOOL)isHeadsetPluggedIn {
    AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
    for (AVAudioSessionPortDescription* desc in [route outputs]) {
        if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones])
            return YES;
    }
    return NO;
}

如果扬声器打开,则currentRoute仅返回“ Speaker”,因此耳机检测失败,并且以上代码返回NO。

我们还尝试使用以下代码检查可用输入,但没有耳机

NSArray<AVAudioSessionPortDescription *> *availableInputs =
[[AVAudioSession sharedInstance] availableInputs];

for (AVAudioSessionPortDescription* desc in availableInputs) {
    NSLog(@"Available Port type: %@", [desc portType]);
}

这仅返回“ MicrophoneBuiltIn”(如果蓝牙为ON,则返回蓝牙),但不返回耳机。

以下是我们用于打开/关闭扬声器的代码。

- (BOOL)switchSpeaker:(BOOL)onOrOff
{
    NSError* audioError = nil;
    BOOL changeResult = NO;

    AVAudioSessionPortOverride override = onOrOff?AVAudioSessionPortOverrideSpeaker:AVAudioSessionPortOverrideNone;

    changeResult = [[AVAudioSession sharedInstance] overrideOutputAudioPort:override                        error:&audioError];

    return changeResult;
}

有什么主意吗?

0 个答案:

没有答案