您的位置:首页 > 移动开发 > IOS开发

iOS - 检测耳机孔是否存在耳机:

2014-03-13 17:29 447 查看
- (id)init
{
self = [super init];
if (self)
{
/*
OSStatus AudioSessionInitialize (
CFRunLoopRef inRunLoop, //运行循环的中断监听器回调应该被运行。传递NULL,使用主运行循环。
CFStringRef inRunLoopMode, //该模式的运行循环的中断监听功能将运行在。传递NULL,就相当于通过kCFRunLoopDefaultMode
AudioSessionInterruptionListener inInterruptionListener, //中断监听器回调函数。应用程序的音频会话对象调用回调时,会话被中断及(如应用程序仍在运行)中断结束时。可以为NULL。见AudioSessionInterruptionListener
void *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;
else
return 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) {

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  耳机 音频