audio路由不改变时的耳机插件插件事件 – iOS

我正在iPad上工作。 我想检测用户插头耳机时。 首先,我在属性kAudioSessionProperty_AudioRouteChange上使用了一个侦听kAudioSessionProperty_AudioRouteChange 。 所以一切都很好,直到我决定添加一个button来切换到扬声器,当耳机仍然插入。 所以我现在面临一个问题,也许有人会有一个想法来解决这个问题。

这是情景:

  • 我插上一个耳机 – >我的audio路由更改callback被称为
  • 然后我将声音切换到扬声器(不拔下耳机) – >audio路由更改callback被称为
  • 然后我拔掉耳机(当声音仍然输出到扬声器) – >audio路由改变callback不被称为,这似乎是合乎逻辑的。

但是这是我的问题! 所以我的问题是:你看到一种方法来检测这个最后一种情况下,耳机是否拔掉?

谢谢你的帮助

编辑:

好的,我find了一个解决方法:

为了检测是否插入了耳机,我常常执行一个testing函数,我需要知道它(而不是使用布尔值),这可能对性能不太好,但它工作,这是我可能需要的代码它:

 //set back the default audio route UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); //check if this default audio route is Heaphone or Speaker CFStringRef newAudioRoute; UInt32 newAudioRouteSize = sizeof(newAudioRoute); AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &newAudioRouteSize, &newAudioRoute); NSString *newAudioRouteString = (__bridge NSString *)newAudioRoute; CFRelease(newAudioRoute); //if this default audio route is not Headphone, it means no headphone is plugged if ([newAudioRouteString rangeOfString:@"Headphones"].location != NSNotFound){ NSLog(@"Earphone available"); return true; } else { NSLog(@"No Earphone available"); return false; } 

希望它会帮助别人!

我想通过以下方式设想一个解决scheme:在AppDelegate中为扬声器创build一个布尔值,让我们来说: BOOL isSpeakerOn 。 每次调用audio路由callback函数时,您都必须validation扬声器的当前情况以及您想要执行的操作。