检测连接的音频设备iOS

8

我正在尝试找出如何检测iPhone/iPad/iPod上连接的音频设备,与此相关的是IT技术。 我了解有关音频路由调用和路由更改回调的所有内容,但这些并不能告诉我有什么已连接。它们只报告音频当前路由到哪里。例如,我需要知道耳机和/或蓝牙是否仍然连接,即使音频路由通过扬声器进行。或者,例如用户在使用蓝牙时插入耳机,然后决定断开蓝牙,我需要知道即使音频仍然通过耳机进行,蓝牙已经断开连接。


1
我在我的应用程序中遇到了类似的问题,我的应用程序可以正确播放流,但是如果我更改音频输出(拔掉耳机),它就停止播放了。你有没有想到如何检测更改音频输出? - Jay Vachhani
3
是的,检测路由变化是通过AudioSessionPropertyListener回调实现的。然后,属性监听器通过AudioSessionAddPropertyListener函数进行注册。但是,上面不是我尝试做的事情。在我的应用程序中,我需要检测连接的设备,以便正确显示可用的路由选项给用户。 - Cliff
3个回答

2
很遗憾,在iOS11中,似乎没有API可靠地获取当前连接的输出设备列表 - 只要当前路由更改,您只能通过AVAudioSession的currentRoute.outputs看到1个设备(当前路由),即使仍然连接多个设备。但是,对于输入,包括带有HFP配置文件的蓝牙设备,如果使用正确的音频会话模式(例如AVAudioSessionModeVoiceChatAVAudioSessionModeVideoChat),可以通过AVAudioSession的availableInputs获取可用输入列表,并且这些输入即使该设备不是活动路由,也会在那里列出 - 当用户通过MPVolumeView进行手动覆盖时,这非常有用,例如从蓝牙切换到扬声器,因为HFP是双向IO(具有输入和输出),您可以通过查看输入来判断输出HFP蓝牙是否仍然可用。
BOOL isBtInputAvailable = NO;
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs];
for (AVAudioSessionPortDescription* port in inputs) {
    if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) {
        isBtInputAvailable = YES;
        break;
    }
}

这方面有任何更新吗?让我感到沮丧的是,我只能知道一个蓝牙设备的连接状态,并且我必须处于.playAndRecord.record模式才能这样做。 - Winston Du

1

如果是iOS 5,您应该使用:

CFStringRef newRoute;
size = sizeof(CFStringRef);
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute), "couldn't get new audio route");
if (newRoute)
{
    CFShow(newRoute);
    if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) == kCFCompareEqualTo) // headset plugged in
          {
            colorLevels[0] = .3;                
            colorLevels[5] = .5;
          }
    else if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), NULL) == kCFCompareEqualTo)
}

0
您可以从AudioSession属性中获取输入源和输出目的地列表。 请查看以下会话属性:
kAudioSessionProperty_InputSources
kAudioSessionProperty_OutputDestinations

而要查询每个的详细信息,您可以使用:

kAudioSessionProperty_InputSource
kAudioSessionProperty_OutputDestination

3
这些属性适用于USB附件,所以在我的情况下不适用。我想要检测蓝牙或有线耳机何时连接上。 - Cliff
抱歉,我的失误,现在我看到你问题的不同之处了。 - MOK9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接