我目前正在使用一段代码来检测用户是否已使用iPhone插入/拔出耳机。我用来检测它的方法如下所示。
void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID,UInt32 inPropertyValueSize, const void *inPropertyValue){
if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;
CFStringRef route; UInt32 routeSize = sizeof(CFStringRef);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute,&routeSize, &route);
NSString *oldroute = (NSString*)route;
NSLog(@"Audio Route changed to: %@",oldroute);
}
当我拔下耳机时,我的问题出现了。将它们插入工作正如我所期望的那样,日志文件显示“音频路由改为:耳机”,然而,当我拔下插头时,我得到了oldroute的空字符串。我希望这个值会像Apple文档中所说的那样“扬声器”。谁看过这个吗?我在获取字符串oldroute时做错了什么?感谢
答案 0 :(得分:1)
对于我发布的问题,我仍然没有找到一个好的答案。这是一个可能适用于有类似问题的人的解决方法。此解决方案为您提供更改前处于活动状态的路径。防爆。如果你拔掉你的耳机,你会得到一个“耳机”字符串,或者如果你戴上耳机,你会得到一个“扬声器”的字符串。
void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID,UInt32 inPropertyValueSize, const void *inPropertyValue){
if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;
CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue;
CFStringRef oroute;
oroute = (CFStringRef)CFDictionaryGetValue(routeChangeDictionary, CFSTR(kAudioSession_AudioRouteChangeKey_OldRoute));
NSString *oldroute = (NSString*)oroute;
}
希望这有帮助。
编辑:我会接受我的答案,直到有更好的答案出现
答案 1 :(得分:0)
我目前使用以下内容:
void _propertyListener( void * inClientData,
AudioSessionPropertyID inID,
UInt32 inDataSize,
const void * inData) {
if (inID != kAudioSessionProperty_AudioRouteChange) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kAudioRouteChanged object:nil];
});
}
- (void) _audioRouteChanged:(NSNotification*)notification
{
NSLog(@"audioRouteChanged");
UInt32 routeSize = sizeof (CFStringRef);
CFStringRef route;
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 = (__bridge NSString*)route;
NSRange headphoneRange = [routeStr rangeOfString : @"Head"];
[self.cardSwipeDelegate headphoneListener:(headphoneRange.location != NSNotFound)];
if (headphoneRange.location != NSNotFound) {
[self startSession];
} else {
[self stopSession];
}
}
}
无论您在哪里进行初始化,都要添加通知:
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(_audioRouteChanged:) name:kAudioRouteChanged object:nil];