- (id)init
{self = [super init];if (self){/*OSStatus AudioSessionInitialize (CFRunLoopRef inRunLoop, //运行循环的中断监听器回调应该被运行。传递NULL,使用主运行循环。CFStringRef inRunLoopMode, //该模式的运行循环的中断监听功能将运行在。传递NULL,就相当于通过kCFRunLoopDefaultModeAudioSessionInterruptionListener inInterruptionListener, //中断监听器回调函数。应用程序的音频会话对象调用回调时,会话被中断及(如应用程序仍在运行)中断结束时。可以为NULL。见AudioSessionInterruptionListenervoid *inClientData //想传递给你的中断监听器回调。);*/AudioSessionInitialize(NULL, NULL, NULL, NULL);AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioRouteChangeCallback, (__bridge void *)(self));}return self;
}- (BOOL)isHeadphone
{UInt32 propertySize = sizeof(CFStringRef);CFStringRef state = nil;AudioSessionGetProperty(kAudioSessionProperty_AudioRoute ,&propertySize,&state);//根据状态判断是否为耳机状态if ([(__bridge NSString *)state isEqualToString:@"Headphone"] ||[(__bridge NSString *)state isEqualToString:@"HeadsetInOut"])return YES;elsereturn NO;
}void audioRouteChangeCallback(void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData)
{SInt32 routeChangeReason;CFDictionaryRef routeChangeDictionary = inData;CFNumberRef routeChangeReasonRef = CFDictionaryGetValue(routeChangeDictionary, CFSTR(kAudioSession_AudioRouteChangeKey_Reason));CFNumberGetValue(routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) { //拔掉}else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable) { //插入[[MPMusicPlayerController applicationMusicPlayer] setVolume:1.0];}else if (routeChangeReason == kAudioSessionRouteChangeReason_NoSuitableRouteForCategory) {}
}