项目中有音频播放,当手机有来电和耳机拔插等行为时,需要做一些操作
来电监听,创建CTCallCenter
@property (nonatomic, strong) CTCallCenter *callCenter ;/*!*电话监听*/
初始化callCenter
if (!self.callCenter) {
self.callCenter = [[CTCallCenter alloc] init];
}
在callCenter的一些事件处理callEventHandler,是一个block回调,我用__weak来调用属性,避免block中内存泄漏
__weak typeof(self) weakSelf = self;
self.callCenter.callEventHandler = ^(CTCall* call) {
if ([call.callState isEqualToString:CTCallStateDisconnected]){
NSLog(@"挂断了电话咯");
}else if ([call.callState isEqualToString:CTCallStateConnected]){
NSLog(@"电话通了");
}else if([call.callState isEqualToString:CTCallStateIncoming]){//在这里可以做一些操作,比如:记录来电话前播放器状态
NSLog(@"来电话了");
//来电话了,由于是音频项目,监听来电事件
if (weakSelf.player.timeControlStatus == AVPlayerTimeControlStatusPlaying) {//AVPlayer系统方法,检测播放器状态,是播放状态还是暂停状态
}else if((weakSelf.player.timeControlStatus == AVPlayerTimeControlStatusPaused)){
//记录播放器状态,用中间变量记录状态可以保证全局使用
}
}else if ([call.callState isEqualToString:CTCallStateDialing]){
NSLog(@"正在播出电话call is dialing");
}else{
NSLog(@"什么都没做");
}
监听耳机拔插
监听耳机是一个系统的单例方法,通过发送通知来做操作
[[AVAudioSession sharedInstance] setActive:YES error:nil];//创建单例对象并且使其设置为活跃状态.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification object:nil];//设置通知
实现通知方法
- (void)audioRouteChangeListenerCallback:(NSNotification*)notification {
NSDictionary *interuptionDict = notification.userInfo;
NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
switch (routeChangeReason) {
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
NSLog(@"耳机插入");
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
//耳机拔出
dispatch_async(dispatch_get_main_queue(), ^{
//做操作,用主线程调用,如果不用主线程会报黄,提示,从一个线程跳到另一个线程容易产生崩溃,所以这里要用主线程去做操作
});
break;
}