我在iPad上工作。我想检测用户何时插入耳机。首先,我在属性kAudioSessionProperty_AudioRouteChange
上使用了一个侦听器。所以一切都很顺利,直到我决定添加一个按钮,以便在耳机仍然插入时切换到扬声器。所以我现在面临一个问题,也许有人会有一个想法来解决它。
这是场景:
- 我插入耳机 ->我的音频路由更改回调被调用
- 然后我将声音切换到扬声器(无需拔下耳机(-调用>音频路由更改回调
- 然后我拔下耳机(当声音仍然输出到扬声器时(->没有调用音频路由更改回调,这似乎是合乎逻辑的。
但这是我的问题!所以我的问题是:您是否看到一种方法可以检测耳机在最后一种情况下被拔掉
?感谢您的帮助
编辑:
好的,我找到了一个解决方法:
为了检测耳机是否插入,我一直在需要知道它时执行一个测试函数(而不是使用布尔值(,这可能对性能不太好,但它正在工作,这是我为可能需要它的人编写的代码:
//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;
}
希望它能帮助某人!
我想象一个解决方案如下:您在 AppDelegate 中为说话人创建一个布尔值,假设: BOOL isSpeakerOn
.每次调用音频路由回调时,您都必须验证扬声器的当前情况以及您要执行的操作。
这是处理此问题的最佳教程:
http://www.techotopia.com/index.php/Detecting_when_an_iPhone_Headphone_or_Docking_Connector_is_Unplugged_(iOS_4(