Detecting if headphones are plugged into iPhone

前端 未结 4 2078
余生分开走
余生分开走 2020-12-05 08:45

Does anyone know if you can detect if headphones are plugged into the iPhone, and if they aren\'t - disable sound from your application.

I think I could manage disab

4条回答
  •  萌比男神i
    2020-12-05 09:28

    To perform a one-off check to determine if headphones are plugged in (rather than setting a callback when they're unplugged) I found the following works in iOS5 and above:

    - (BOOL) isAudioJackPlugged
    {
    
    // initialise the audio session - this should only be done once - so move this line to your AppDelegate
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    UInt32 routeSize;
    
    // oddly, without calling this method caused an error.
    AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize);
    CFDictionaryRef desc; // this is the dictionary to contain descriptions
    
    // make the call to get the audio description and populate the desc dictionary
    AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc);
    
    // the dictionary contains 2 keys, for input and output. Get output array
    CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Outputs);
    
    // the output array contains 1 element - a dictionary
    CFDictionaryRef dict = CFArrayGetValueAtIndex(outputs, 0);
    
    // get the output description from the dictionary
    CFStringRef output = CFDictionaryGetValue(dict, kAudioSession_AudioRouteKey_Type);
    
    /**
     These are the possible output types:
     kAudioSessionOutputRoute_LineOut
     kAudioSessionOutputRoute_Headphones
     kAudioSessionOutputRoute_BluetoothHFP
     kAudioSessionOutputRoute_BluetoothA2DP
     kAudioSessionOutputRoute_BuiltInReceiver
     kAudioSessionOutputRoute_BuiltInSpeaker
     kAudioSessionOutputRoute_USBAudio
     kAudioSessionOutputRoute_HDMI
     kAudioSessionOutputRoute_AirPlay
     */
    
    return CFStringCompare(output, kAudioSessionOutputRoute_Headphones, 0) == kCFCompareEqualTo;
    }
    

    For those keeping score at home, that's a string in a dictionary in an array in a dictionary.

提交回复
热议问题