// iOS 7 的代码
- (BOOL)hasHeadset
{
#if TARGET_IPHONE_SIMULATOR
return NO;
#else
CFStringRef route;
UInt32 size = sizeof(CFStringRef);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &route);
if((route == NULL) || (CFStringGetLength(route) == 0))
{
NSLog(@"AudioSessionGetProperty failed!");
}
else
{
NSString* routeStr = (__bridge NSString*)route;
NSLog(@"AudioRoute: %@", routeStr);
/* Known values of route:
* "Headset"
* "Headphone"
* "Speaker"
* "SpeakerAndMicrophone"
* "HeadphonesAndMicrophone"
* "HeadsetInOut"
* "ReceiverAndMicrophone"
* "Lineout"
*/
NSRange headphoneRange = [routeStr rangeOfString : @"Headphone"];
NSRange headsetRange = [routeStr rangeOfString : @"Headset"];
if (headphoneRange.location != NSNotFound
|| headsetRange.location != NSNotFound)
{
return YES;
}
}
return NO;
#endif
}
// iOS 6 之后的代码
- (void)addHeadPhoneListener
{
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(audioRouteChangeListenerCallback:)
name:AVAudioSessionRouteChangeNotification
object:nil];
}
// If the user pulls out he headphone jack, stop playing.
- (void)audioRouteChangeListenerCallback:(NSNotification*)notification
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
AVAudioSessionRouteDescription *curRoute = audioSession.currentRoute;
NSDictionary *interuptionDict = notification.userInfo;
NSLog(@"interuptionDict:%@", interuptionDict);
AVAudioSessionPortDescription * portDescription = [curRoute.outputs firstObject];
AVAudioSessionPortDescription * inputDesc = [curRoute.inputs firstObject];
//例如输出:Headphones,耳机
NSLog(@"%@,%@", portDescription.portType, portDescription.portName);
//例如输出:MicrophoneWired, 耳机麦克风
NSLog(@"%@, %@", inputDesc.portType, inputDesc.portName);
NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
// AVAudioSessionRouteDescription *val = interuptionDict[AVAudioSessionRouteChangePreviousRouteKey];
switch (routeChangeReason)
{
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
NSLog(@"Headphone/Line plugged in");
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
NSLog(@"Headphone/Line was pulled. Stopping player....");
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
break;
}
}