iOS – 檢測耳機孔是否存在耳機: – iPhone手機開發技術文章 iPhone軟體開發教學課程

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

發佈留言