天天看点

获取ios耳机线控事件

-(BOOL)canBecomeFirstResponder{

    NSLog(@"_____%s_____",__FUNCTION__);

    return YES;

}

//received remote event

-(void)remoteControlReceivedWithEvent:(UIEvent *)event{

    NSLog(@"event tyipe:::%d   subtype:::%d",event.type,event.subtype);

    //type==2  subtype==单击暂停键:103,双击暂停键104

    if (event.type == UIEventTypeRemoteControl) {

        switch (event.subtype) {

            case UIEventSubtypeRemoteControlPlay:{

                NSLog(@"play---------");

            }break;

            case UIEventSubtypeRemoteControlPause:{

                NSLog(@"Pause---------");

            }break;

            case UIEventSubtypeRemoteControlStop:{

                NSLog(@"Stop---------");

            }break;

            case UIEventSubtypeRemoteControlTogglePlayPause:{

                //单击暂停键:103

                NSLog(@"单击暂停键:103");

            }break;

            case UIEventSubtypeRemoteControlNextTrack:{

                //双击暂停键:104

                NSLog(@"双击暂停键:104");

            }break;

            case UIEventSubtypeRemoteControlPreviousTrack:{

                NSLog(@"三击暂停键:105");

            }break;

            case UIEventSubtypeRemoteControlBeginSeekingForward:{

                NSLog(@"单击,再按下不放:108");

            }break;

            case UIEventSubtypeRemoteControlEndSeekingForward:{

                NSLog(@"单击,再按下不放,松开时:109");

            }break;

            default:

                break;

        }

    }

}

把上面代码加进去就能获取耳机线控的各个点击事件,嘀嘀打车之前版本中有一个耳机抢单的功能,就是这么实现的

====================================================================================================

ios 开发中 捕获耳机插拔事件

void audioRouteChangeListenerCallback ( void *inUserData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData) { UInt32 propertySize = sizeof(CFStringRef); AudioSessionInitialize(NULL, NULL, NULL, NULL); CFStringRef state = nil; AudioSessionGetProperty(kAudioSessionProperty_AudioRoute ,&propertySize,&state);

NSLog(@"%@",(NSString *)state);//return @"Headphone" or @"Speaker" and so on.

}

- (void)viewDidLoad {

[super viewDidLoad];

AudioSessionInitialize (NULL, NULL, NULL, NULL); OSStatus status = AudioSessionAddPropertyListener( kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback,self); //if(status == 0){//ok;} }

====================================================================================================

首先导入系统类库  

#import<AVFoundation/AVFoundation.h>

   //监听耳机事件

    [[AVAudioSessionsharedInstance] setDelegate:self];

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

    [[AVAudioSessionsharedInstance] setCategory:AVAudioSessionCategoryPlaybackerror: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 = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen]bounds]]autorelease];

   //登陆VC

   LoginViewController *loginVC = [[LoginViewControlleralloc]init ];

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

    [navNVsetNavigationBarHidden:YES];

    [loginVC release];

   //监听耳机事件

    [[AVAudioSessionsharedInstance] setDelegate:self];

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

    [[AVAudioSessionsharedInstance] setCategory:AVAudioSessionCategoryPlaybackerror: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  搞定!