iOS AVAudioSession中断通知不按预期工作
我想知道什么时候我的AVAudioRecorder
无法访问(例如,当音乐开始播放)。
由于audioRecorderEndInterruption
将被弃用与iOS 9我专注于AVAudioSession
的中断通知(但都没有按预期工作)。
问题是,如果应用程序在中断发生时仍处于前台,中断通知从不会被调用。
例如:用户启动和停止播放音乐,而不将应用程序移动到后台。
要检测我正在使用的任何中断:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:nil]; ... - (void)audioSessionWasInterrupted:(NSNotification *)notification { if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) { NSLog(@"Interruption notification"); if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) { NSLog(@"InterruptionTypeBegan"); } else { NSLog(@"InterruptionTypeEnded"); } } }
如预期的那样,我得到InterruptionTypeBegan
,但是如果应用程序仍处于前台(即在应用程序放置在后台并返回前台之前不会调用),则不会调用InterruptionTypeEnded
。
在应用程序处于前台时发生中断时,如何接收InterruptionTypeEnded
通知?
这是一个普遍的问题,影响任何使用AV
框架组件的应用程序(本地iOS应用程序也是如此)。
正如在关于audio中断主题的文档中所解释的那样, InterruptionTypeEnded
实际上应该应用在所提到的场景中:
如果用户驳回中断…系统将调用您的回叫方法,表明中断已经结束。
但是,它也表示InterruptionTypeEnded
可能根本不会被调用:
不能保证开始中断将会终止中断。
因此,在上述情况下需要采取不同的方法。
当处理音乐中断时,问题不会持续很长时间。 当应用程序的audio处理程序被调用时,iOS 9有效地防止外部audio源被使用。
一个处理媒体中断的确切问题的方法可能是监听MPMusicPlayerController
的playbackState
,如下面的stackoverflow问题所示: 检测音乐是否正在播放? 。
处理中断问题的更直接的方法是:
在InterruptionTypeBegan
时间通过重新调用audio组件完全阻止audioInterruptionTypeBegan
。
或者通过提供UI指示,说明外部媒体源已经中断了audio会话(例如,显示不活动的麦克风)。
希望会提出一个更好的解决scheme,但同时这应该给你一些select来解决中断问题。
如果你还没有,尝试设置你的AVCaptureSession
的属性usesApplicationAudioSession
为NO 。
如果您正在寻找更多的细节, 这个问题和答案可能是一个很好的参考。
我试试这个,发现InterruptionTypeEnded可能会在一些应用程序中暂停音乐之后调用,但是其他的暂停时不会调用。
我的解决scheme是更新用户界面,让用户知道logging已停止并执行一些相关的工作,如文件操作。 当中断结束时,激活AVAudioSession, 如果没有错误 ,则开始新的logging。
如果你想join中断前后的文件,这个问题的答案是: AVAudioRecorder只logging中断后的audio可能对你有帮助。