在iPhone上的耳机和扬声器之间切换

我正在尝试设置iPhone应用程序输出的audio路由。 我正在使用路由更改侦听器来检测何时audio路由已更改。 聆听者检测到这些变化,例如耳机插入和拔出的时间。 默认情况下,扬声器播放audio,然后插入耳机,并通过耳机传输audio。 从那里,即使路由更改侦听器正在检测它们,也不会发生任何更改。

任何帮助将非常感激。

NSError *sessionError = nil; [[AVAudioSession sharedInstance] setDelegate:self]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(sessionCategory), &sessionCategory); AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, RouteChangeListener, (__bridge void *)(self)); AudioSessionSetActive(YES); 

callback监听器:

 void RouteChangeListener( void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue) { if (inPropertyID == kAudioSessionProperty_AudioRouteChange) { CFStringRef newRoute; UInt32 size = sizeof(CFStringRef); AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute); if (newRoute) { CFShow(newRoute); if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), (UInt32)NULL) == kCFCompareEqualTo) { UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); } else if (CFStringCompare(newRoute, CFSTR("HeadphonesAndMicrophone"), (UInt32)NULL) == kCFCompareEqualTo) { UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); [[[AVAudioSession sharedInstance] player] play]; } } } }