【问题标题】:Detect attached audio devices iOS检测连接的音频设备 iOS
【发布时间】:2011-09-08 22:33:48
【问题描述】:

我正在尝试弄清楚如何检测 iphone/ipad/ipod 上是否连接了哪些音频设备。我知道所有关于音频路由调用和路由更改回调的信息,但这些并没有告诉我任何关于附加内容的信息。他们只报告音频当前路由的位置。例如,我需要知道在音频通过扬声器路由时是否仍连接耳机和/或蓝牙。或者,例如,如果用户在使用蓝牙时插入耳机然后决定断开蓝牙,我需要知道即使音频仍在通过耳机路由,蓝牙也已断开。

【问题讨论】:

  • 我在我的应用程序中遇到了类似的问题,我的应用程序正在正确播放流,但是如果我更改音频输出(拔下耳机),它会停止播放..您是否知道如何检测音频输出何时更改?
  • 是的,检测路由更改是通过 AudioSessionPropertyListener 回调完成的。然后通过 AudioSessionAddPropertyListener 函数注册属性监听器。然而,这不是我在上面想要做的。在我的应用程序中,我需要检测连接了哪些设备才能正确地向用户显示可用的路由选项。

标签: ios audio bluetooth


【解决方案1】:

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

但是,对于输入,包括具有 HFP 配置文件的蓝牙设备,如果使用正确的音频会话模式(例如 AVAudioSessionModeVoiceChatAVAudioSessionModeVideoChat),可以通过 AVAudioSession 的 @ 获取可用输入的列表987654324@,即使该设备不是活动路由,这些输入也会在此处列出 - 例如,当用户通过 MPVolumeView 从蓝牙到扬声器进行手动覆盖时,这非常有用,因为 HFP 是 2 -way 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模式下才能这样做。
【解决方案2】:

如果是 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)
}

【讨论】:

    【解决方案3】:

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

    kAudioSessionProperty_InputSources
    kAudioSessionProperty_OutputDestinations
    

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

    kAudioSessionProperty_InputSource
    kAudioSessionProperty_OutputDestination
    

    【讨论】:

    • 这些属性适用于 USB 附件,因此不适用于我的情况。我希望检测何时连接了蓝牙或有线耳机。
    • 糟糕,很抱歉,我现在看到你的问题有所不同了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多