2013-11-14 3 views
0

Я использую приведенный ниже код, чтобы определить, подключен ли какой-либо «наушник» к устройству iOS.iPod touch не обнаруживает наушники

//find out, if any earphones are connected to the device 
- (BOOL)isHeadsetPluggedIn { 
    UInt32 routeSize = sizeof (CFStringRef); 
    CFStringRef route; 
    NSLog(@"Inside 'isHeadsetPluggedIn'"); 

    // Registers the audio route change listener callback function 
    AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, (__bridge void *)(self)); 

    OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, 
               &routeSize, 
               &route); 

    /* Known values of route: 
    * "Headset" 
    * "Headphone" 
    * "Speaker" 
    * "SpeakerAndMicrophone" 
    * "HeadphonesAndMicrophone" 
    * "HeadsetInOut" 
    * "ReceiverAndMicrophone" 
    * "Lineout" 
    */ 

    if (!error && (route != NULL)) { 
     NSString* routeStr = (NSString*)CFBridgingRelease(route); 
     NSRange headphoneRange = [routeStr rangeOfString : @"Head"]; 
     NSLog(@"route %@", routeStr); 
     if (headphoneRange.location != NSNotFound) { 
      return YES; 
     } 
    } else { 
     NSLog(@"Error %d while retrieving audio property", error); 
    } 
    return NO; 
} 

Приведенный выше код отлично подходит для iPad, iPad и iPhone. Но в устройстве «iPod touch» функция «AudioSessionGetProperty» возвращает ошибку «Ошибка» 560557673 «при восстановлении свойства звука». Следовательно, он не обнаруживает, подключен ли какой-либо «наушник» к устройству «iPod touch».

Как узнать «наушник» на устройстве «iPod touch»?

ответ

0

Я могу решить эту проблему, используя приведенный ниже метод (найденный из «SO», но не помню адрес).

BOOL isAudioRouteAvailable(CFStringRef routeType) 
{ 
    /* 
    As of iOS 5: 
    kAudioSessionOutputRoute_LineOut; 
    kAudioSessionOutputRoute_Headphones; 
    kAudioSessionOutputRoute_BluetoothHFP; 
    kAudioSessionOutputRoute_BluetoothA2DP; 
    kAudioSessionOutputRoute_BuiltInReceiver; 
    kAudioSessionOutputRoute_BuiltInSpeaker; 
    kAudioSessionOutputRoute_USBAudio; 
    kAudioSessionOutputRoute_HDMI; 
    kAudioSessionOutputRoute_AirPlay; 
    */ 

    //Prep 
    BOOL foundRoute = NO; 
    CFDictionaryRef description = NULL; 

    //Session 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     AudioSessionInitialize(NULL, NULL, NULL, NULL); 
    }); 

    //Property 
    UInt32 propertySize; 
    AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &propertySize); 
    OSStatus error = AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &propertySize, &description); 
    if (!error && description) { 
     CFArrayRef outputs = CFDictionaryGetValue(description, kAudioSession_AudioRouteKey_Outputs); 
     CFIndex count = CFArrayGetCount(outputs); 
     if (outputs && count) { 
      for (CFIndex i = 0; i < count; i++) { 
       CFDictionaryRef route = CFArrayGetValueAtIndex(outputs, i); 
       CFStringRef type = CFDictionaryGetValue(route, kAudioSession_AudioRouteKey_Type); 
       NSLog(@"Got audio route %@", type); 

       //Audio route type 
       if (CFStringCompare(type, routeType, 0) == kCFCompareEqualTo) { 
        foundRoute = YES; 
        break; 
       } 
      } 
     } 
    } else if (error) { 
     NSLog(@"Audio route error %ld", error); 
    } 

    //Cleanup 
    if (description) { 
     CFRelease(description); 
    } 

    //Done 
    return foundRoute; 
} 

И по телефону,

isAudioRouteAvailable(kAudioSessionOutputRoute_Headphones) 
Смежные вопросы