检测iPhone / iPod Touch配件

时间:2009-03-20 17:41:29

标签: iphone objective-c ipod-touch

是否可以检测iPod Touch / iPhone是否连接了耳机或其他配件?

我正在构建一个需要麦克风的应用程序,需要知道“iSomething”是否有连接,可以通过基座连接,也可以使用耳机端口,例如内置耳机/麦克风配件来自Apple。

5 个答案:

答案 0 :(得分:10)

终于找到了它 - 在初始化Audio Session对象之后, - AudioSessionInitialize() - 你可以调用AudioSessionGetProperty,并获得kAudioSessionProperty_AudioInputAvailable的值。

AudioSessionInitialize(NULL, NULL, NULL, NULL);    
UInt32 propertySize, micConnected;
    AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &propertySize, &micConnected);
    [self updateMicStatus:micConnected]; // user-created method

根据音频会话服务的文档,应使用此设备而不是使用设备型号(iPhone与iPod Touch)来确定是否可以使用音频输入。您还可以设置回调函数,以通过AudioSessionAddPropertyListener()监视对此属性的更改。

尚不确定此属性是否也适用于通过Dock接口连接的设备,但它似乎适用于耳机插孔。

答案 1 :(得分:4)

或者您可以使用:

if (![[AVAudioSession sharedInstance] inputIsAvailable]) {
    // your code here for no audio input available
}

答案 2 :(得分:4)

IOS 6 inputIsAvailable 已弃用。将来我们需要使用inputAvailable

BOOL audioHWAvailable = audioSession.inputAvailable;

答案 3 :(得分:0)

要确定设备是否具有内置麦克风,您可以通过[UIDevice currentDevice].model查看它是iPhone还是第二代iPod Touch。至于第三方麦克风插入基座连接器,这在当前的2.2.1 SDK中是不可能的,但它可能是在更高版本中:)

答案 4 :(得分:0)

以下是解决方案,您可能会喜欢或对您有所帮助。

在使用以下方法之前,请同时写下这两行

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

- (void)isHeadsetPluggedIn {

    UInt32 routeSize = sizeof (CFStringRef);
    CFStringRef route;

    AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
                                              &routeSize,
                                              &route);

    //NSLog(@"Error >>>>>>>>>> :%@", error);
    /* Known values of route:
     * "Headset"
     * "Headphone"
     * "Speaker"
     * "SpeakerAndMicrophone"
     * "HeadphonesAndMicrophone"
     * "HeadsetInOut"
     * "ReceiverAndMicrophone"
     * "Lineout"
     */

    NSString* routeStr = (NSString*)route;

    NSRange headsetRange = [routeStr rangeOfString : @"Headset"];
    NSRange receiverRange = [routeStr rangeOfString : @"Receiver"];

    if(headsetRange.location != NSNotFound) {
        // Don't change the route if the headset is plugged in.
        NSLog(@"headphone is plugged in ");
    } 
    else if (receiverRange.location != NSNotFound) {
        // Change to play on the speaker
        NSLog(@"play on the speaker");

    } 
    else {
        NSLog(@"Unknown audio route.");

    }
}