简体   繁体   English

如何在iOS中检测外部麦克风?

[英]How can I detect external microphone in iOS?

如何从应用程序内部检测设备是否插入了外部麦克风?

Try this: 尝试这个:

let route = AVAudioSession.sharedInstance().currentRoute

for port in route.outputs {
    if port.portType == AVAudioSessionPortHeadphones {
        // Headphones located
    }
}

EDIT: Post OP change in question - 编辑:发布有问题的OP更改-

When app is running you need to register for AVAudioSessionRouteChangeNotification to listen to the changes like this: 当应用程序运行时,您需要注册AVAudioSessionRouteChangeNotification来监听这样的更改:

NSNotificationCenter.defaultCenter().addObserver(self, selector:"audioRouteChangeListener:", name: AVAudioSessionRouteChangeNotification, object: nil)

dynamic private func audioRouteChangeListener(notification:NSNotification) {
    let audioRouteChangeReason = notification.userInfo![AVAudioSessionRouteChangeReasonKey] as UInt

    switch audioRouteChangeReason {
    case AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue:
        println("headphone plugged in")
    case AVAudioSessionRouteChangeReason.OldDeviceUnavailable.rawValue:
        println("headphone pulled out")
    default:
        break
    }
}

swift3: swift3:

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

@objc private func audioRouteChangeListener(notification: Notification) {
    let rawReason = notification.userInfo![AVAudioSessionRouteChangeReasonKey] as! UInt
    let reason = AVAudioSessionRouteChangeReason(rawValue: rawReason)!

    switch reason {
    case .newDeviceAvailable:
        print("headphone plugged in")
    case .oldDeviceUnavailable:
        print("headphone pulled out")
    default:
        break
    }
}

With swift 2.0 this code works 在Swift 2.0中,此代码有效

func audioRouteChangeListenerCallback (notif: NSNotification){
    let userInfo:[NSObject:AnyObject] = notif.userInfo!
    let routChangeReason = UInt((userInfo[AVAudioSessionRouteChangeReasonKey]?.integerValue)!)
    switch routChangeReason {
    case AVAudioSessionRouteChangeReason.NewDeviceAvailable.rawValue:
        print("Connected");
        break;

    case AVAudioSessionRouteChangeReason.OldDeviceUnavailable.rawValue:
        do {
            try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker)
        } catch _ {
        }
        print("Connected");
        break;

    case AVAudioSessionRouteChangeReason.CategoryChange.rawValue:
        break;
    default:
        break;
    }
}

With AVAudioSession you can list the availableInputs 使用AVAudioSession您可以列出availableInputs

    let session = AVAudioSession.sharedInstance()

    _ = try? session.setCategory(AVAudioSessionCategoryRecord, withOptions: [])

    print(AVAudioSession.sharedInstance().availableInputs)

It return an array of AVAudioSessionPortDescription . 它返回一个AVAudioSessionPortDescription数组。 And you can have the portType "wired or builtIn" microphone type. 您还可以使用portType“有线或内置”麦克风类型。

PS : It only work on real device not on simulator. PS:它只能在真实设备上运行,不能在模拟器上运行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM