现在的位置: 首页 > 综合 > 正文

iOS 如何监听出插入耳机 拔掉耳机事件?

2013年10月06日 ⁄ 综合 ⁄ 共 2599字 ⁄ 字号 评论关闭
首先导入系统类库  

#import<AVFoundation/AVFoundation.h>

   //监听耳机事件

    [[AVAudioSessionsharedInstancesetDelegate:self];

    

   // Use this code instead to allow the app sound to continue to play when the screen is locked.

    [[AVAudioSessionsharedInstance]setCategory:AVAudioSessionCategoryPlayback error:nil];

    

   // Registers the audio route change listener callback function

   AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,audioRouteChangeListenerCallback,self);

把这段代码 写到 你需要监听的地方 

我个人推荐放到

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOption

因为是全局嘛 哪里都可以响应到 

例如 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

   self.window = [[[UIWindowallocinitWithFrame:[[UIScreenmainScreenbounds]]autorelease];

   //登陆VC

   LoginViewController *loginVC = [[LoginViewControlleralloc]init];

   UINavigationController *navNV = [[UINavigationControlleralloc]initWithRootViewController:loginVC
];

    [navNVsetNavigationBarHidden:YES];

    [loginVC release];

    

   //监听耳机事件

    [[AVAudioSessionsharedInstancesetDelegate:self];

    

   // Use this code instead to allow the app sound to continue to play when the screen is locked.

    [[AVAudioSessionsharedInstance]setCategory:AVAudioSessionCategoryPlayback error:nil];

    

   // Registers the audio route change listener callback function

   AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,audioRouteChangeListenerCallback,self);

    

   self.window.rootViewController = navNV;

    [navNV release];

   self.window.backgroundColor = [UIColorwhiteColor];

    [self.windowmakeKeyAndVisible];

   return YES;

}

//触发的监听事件 

void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize,const void *inPropertyValue
) {

   // ensure that this callback was invoked for a route change

    if (inPropertyID != kAudioSessionProperty_AudioRouteChange)return;

    

    

    {

       // Determines the reason for the route change, to ensure that it is not

       //      because of a category change.

        CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue;

        

        CFNumberRef routeChangeReasonRef = (CFNumberRef)CFDictionaryGetValue (routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_Reason) );

        SInt32 routeChangeReason;

        CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);

        

        if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {

            

           //Handle Headset Unplugged

            

            DLog(@"没有耳机!");

            

        } else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable) {

           //Handle Headset plugged in

            DLog(@"有耳机!");

        }

        

    }

}

OK  搞定!

抱歉!评论已关闭.