我正在尝试找出如何检测iPhone/iPad/iPod上连接的音频设备,与此相关的是IT技术。 我了解有关音频路由调用和路由更改回调的所有内容,但这些并不能告诉我有什么已连接。它们只报告音频当前路由到哪里。例如,我需要知道耳机和/或蓝牙是否仍然连接,即使音频路由通过扬声器进行。或者,例如用户在使用蓝牙时插入耳机,然后决定断开蓝牙,我需要知道即使音频仍然通过耳机进行,蓝牙已经断开连接。
我正在尝试找出如何检测iPhone/iPad/iPod上连接的音频设备,与此相关的是IT技术。 我了解有关音频路由调用和路由更改回调的所有内容,但这些并不能告诉我有什么已连接。它们只报告音频当前路由到哪里。例如,我需要知道耳机和/或蓝牙是否仍然连接,即使音频路由通过扬声器进行。或者,例如用户在使用蓝牙时插入耳机,然后决定断开蓝牙,我需要知道即使音频仍然通过耳机进行,蓝牙已经断开连接。
currentRoute.outputs
看到1个设备(当前路由),即使仍然连接多个设备。但是,对于输入,包括带有HFP配置文件的蓝牙设备,如果使用正确的音频会话模式(例如AVAudioSessionModeVoiceChat
或AVAudioSessionModeVideoChat
),可以通过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如果是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)
}
kAudioSessionProperty_InputSources
kAudioSessionProperty_OutputDestinations
而要查询每个的详细信息,您可以使用:
kAudioSessionProperty_InputSource
kAudioSessionProperty_OutputDestination