检测连接的audio设备的iOS

我试图找出如何检测如果任何audio设备连接在iphone / ipad / ipod上。 我知道所有有关audio路由调用和路由更改callback,但这些都不告诉我什么附加的东西。 他们只报告audio当前路由的位置。 我需要知道,例如,如果耳机和/或蓝牙仍然连接,而audio通过扬声器路由。 或者,例如,如果用户在使用蓝牙时插入耳机,然后决定断开蓝牙,则需要知道即使audio仍然通过耳机路由,蓝牙也是断开的。

在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) } 

您可以从AudioSession属性获取InputSources和OutputDestinations的列表。 看看这些会话属性:

 kAudioSessionProperty_InputSources kAudioSessionProperty_OutputDestinations 

而要查询每个细节,可以使用:

 kAudioSessionProperty_InputSource kAudioSessionProperty_OutputDestination 

不幸的是,截至iOS11,似乎没有API可靠地获取当前连接的输出设备的列表 – 只要当前路由发生变化,您只能通过AVAudioSession的currentRoute.outputs看到1个设备(当前路由),即使多个设备可能仍然连接。

但是,对于input,包括具有HFPconfiguration文件的蓝牙设备,如果使用适当的audio会话模式(例如AVAudioSessionModeVoiceChatAVAudioSessionModeVideoChat ),则可以通过AVAudioSession的availableInputs可用input的列表,并且那些input在那里列出即使该设备不是主动路由 – 例如,当用户通过MPVolumeView从蓝牙向扬声器进行手动覆盖时,这非常有用,并且由于HFP是双向IO(同时具有input和输出),您可以通过查看input来判断输出HFP蓝牙是否仍然可用。

 BOOL isBtInputAvailable = NO; NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs]; for (AVAudioSessionPortDescription* port in inputs) { if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) { isBtInputAvailable = YES; break; } }