简体   繁体   中英

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 -

When app is running you need to register for AVAudioSessionRouteChangeNotification to listen to the changes like this:

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:

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

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

    let session = AVAudioSession.sharedInstance()

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

    print(AVAudioSession.sharedInstance().availableInputs)

It return an array of AVAudioSessionPortDescription . And you can have the portType "wired or builtIn" microphone type.

PS : It only work on real device not on simulator.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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