问题解决:AVAudioSession的中断处理方法失效

背景知识:

在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;

你可能感兴趣的:(ios,音频)