背景知识:
在iOS中,app录音/播放时,有可能会出现被系统中断的情况,比如手机来电话,闹钟,日历事件等等。这时候,系统会中断当前的音频操作,并向app发送一个通知;如果用户点了“忽略”,或者挂断电话等,系统会将声音权限还给app,并再次向app发送通知。具体实现如下:
//监听interruption事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:nil];
在方法中可以接收到事件是中断开始,还是中断结束,并进行相应的操作,比如保存音频播放的位置,更新UI等等:
- (void)handleInterruption:(NSNotification*)notification {
NSLog(@"interruption info:%@",notification.userInfo);
}
问题描述:
有时候,设置的中断监听方法会失效,在来电/闹钟等的时候,没有调用监听函数。AVAudioSession已经作了正确的设置:
AVAudioSession* session = [AVAudioSession sharedInstance];
NSError* error;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[session setActive:YES error:&error];
问题原因:
有的app使用了AVCaptureDevice和AVCaptureSession,以进行录音录像操作。为了调优app设置,以更好的进行录音录像,从iOS7开始,在默认情况下,AVCaptureSession会使用app的AVAudioSession,并对其进行修改。这样,设置的中断监听方法会失效。
解决方法:
可以对AVCaptureSession进行设置,让它不要使用app的AVAudioSession:
AVCaptureSession* captureSession = [AVCaptureSession new];
captureSession.usesApplicationAudioSession = NO;