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



- (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) {
        
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值