如何在iOS设备上检测耳机(扬声器)的可用性?

时间:2016-12-29 06:51:21

标签: ios swift avfoundation avaudiosession

我想在iPad上专门检测是否有可用的耳机。

例如 - 我可以检测iOS设备是否具有使用AVFoundation的Turch,因此有没有办法检测耳机的可用性。

6 个答案:

答案 0 :(得分:3)

1)如果您想检查设备上是否有耳机(接收器扬声器)

您可以通过简单地识别设备是否为iPhone来识别这一点。

UIDevice.current.userInterfaceIdiom == .phone

iOS中的

原型AVAudioSessionPortBuiltInReceiver适用于builtInreceriver扬声器。 并且根据apple's documentation,这仅适用于iPhone设备。因此,没有必要检查其他任何东西,如果它的iPhone,你有耳机,如果它不是iPhone(在iPad上)它没有耳机。

2)如果您想检查是否连接了手机:

您可以使用共享音频会话的电流来检查耳机是否已连接: 这是 swift 3.0

中的示例函数
   func IsHeadSetConnected() -> Bool{
        let route  = AVAudioSession.sharedInstance().currentRoute;
        for desc   in route.outputs
        {
            let portType = desc.portType;
            if (portType == AVAudioSessionPortHeadphones)
            {
                return true;
            }

        }

        return false;
    } 

您还应该通过监听路线变化来监控其状态:

NotificationCenter.default.addObserver(self, selector: #selector(handleRouteChange(_:)), name: NSNotification.Name.AVAudioSessionRouteChange, object: nil)

以下是上述通知设置处理程序的示例代码:

func handleRouteChange(_ notification: Notification) {
    guard
    let userInfo = notification.userInfo,
    let reasonRaw = userInfo[AVAudioSessionRouteChangeReasonKey] as? NSNumber,
    let reason = AVAudioSessionRouteChangeReason(rawValue: reasonRaw.uintValue)
    else { fatalError("Strange... could not get routeChange") }
    switch reason {
    case .oldDeviceUnavailable:
        print("oldDeviceUnavailable")
    case .newDeviceAvailable:
        print("headset/line plugged in")
    case .routeConfigurationChange:
        print("headset pulled out")
    case .categoryChange:
        print("Just category change")
    default:
        print("not handling reason")
    }
}

答案 1 :(得分:2)

斯威夫特3:

    import AVFoundation    

    let currentRoute = AVAudioSession.sharedInstance().currentRoute

    for description in currentRoute.outputs {
        if description.portType == AVAudioSessionPortLineOut {

        }else if description.portType == AVAudioSessionPortHeadphones {

        }else if description.portType == AVAudioSessionPortBluetoothA2DP{

        }else if description.portType == AVAudioSessionPortBuiltInReceiver{

        }else if description.portType == AVAudioSessionPortBuiltInSpeaker{

        }else if description.portType == AVAudioSessionPortHDMI{

        }else if description.portType == AVAudioSessionPortAirPlay{

        }else if description.portType == AVAudioSessionPortBluetoothLE{

        }
    }

参考:

Apple文档:https://developer.apple.com/reference/avfoundation/avaudiosessionportdescription/1669281-output_port_types

答案 2 :(得分:0)

简短而简单的方法是通过contains检查。

func isHeadphonesConnected() -> Bool{
    let routes = AVAudioSession.sharedInstance().currentRoute
    return routes.outputs.contains(where: { (port) -> Bool in
        port.portType == AVAudioSessionPortHeadphones
    })
}

答案 3 :(得分:0)

检查

...
public void actionPerformed(ActionEvent A){
tabs.addTab("untitled", null, null, "untitled");
UserInterface.APP.addTab(tabs);}}
...

答案 4 :(得分:0)

您可以检查内置麦克风是否可用。

var isMicAvailable = false
if let availableInputs = AVAudioSession.sharedInstance().availableInputs {
    for route in availableInputs {
        if ( route.portType == AVAudioSessionPortBuiltInMic ) {
            //built-in-mic available
            isMicAvailable = true
            break;
        }
    }
}
print("current device has mic - \(isMicAvailable)")

另一种检查当前设备是否为iPhone的方法。

NSString *deviceType = [UIDevice currentDevice].model;
if([deviceType isEqualToString:@"iPhone"]) {
    //current device is iPhone.
}

答案 5 :(得分:0)

一个班轮快速4 + 解决方案:

检测是否有内置麦克风

let isMicAvailable: Bool = AVAudioSession.sharedInstance().availableInputs?.first(where: { $0.portType == AVAudioSessionPortBuiltInMic }) != nil

检测是否有耳塞(接收器扬声器)

let isEarPieceAvailable: Bool = AVAudioSession.sharedInstance().currentRoute.outputs.first(where: { $0.portType == AVAudioSessionPortBuiltInReceiver }) != nil