我需要一种方法来改变或禁用AudioSessionInterruptionListener在AudioSession已经初始化。
原因如下:在某些用例中,我的应用程序必须在后台运行音频录制,所以设置了音频背景模式-这是有效的。当调用或其他中断发生时,我必须通知一些其他对象来干净地停止记录-这是有效的。然后当应用程序完成AudioSession我调用AudioSessionSetActive(false);
-这工作(如果应用程序被发送到后台与会话活动,我得到在顶部的红色条,如果会话是不活动的,红色条不出现。虽然,我猜,从技术上讲,应用程序仍处于"活动"后台模式)。
!在我完成录音的情况下,应用程序已经被发送到后台,音频会话已经被停用,如果一个呼叫进来,或者如果Siri被激活,那么我的应用程序仍然接收AudioSessionInterruptionListener回调。是的,我可以添加代码来测试如果我的应用程序目前应该响应中断。然而,我认为这是一个bug。如果我停用AudioSession,中断应该停止被调用,实际上所有音频会话/属性侦听器应该停止被调用。
如何更改或禁用AudioSessionInterruptionListener?或者换句话说,我如何阻止应用在不需要后台模式时"使用"它?
好的,似乎在ios6中现在有AudioSession中断的NSNotifications: AVAudioSessionDidBeginInterruptionNotification
和AVAudioSessionDidEndInterruptionNotification
。然而,我支持iOS 5.1及以上版本,所以这没有帮助。我发现新通知的相同文档说Obj-C接口AVAudioSession的委托属性贬值(在IOS 6中),所以我可能不应该使用它来设置/更改委托(并获得Obj-C中断回调)。
我猜一个可能的解决办法是测试iOS版本和在<6.0设置和取消设置的委托,然后在6.0+监听NSNotifications(这不会出现在<6.0,所以不应该打破)。然而,这似乎是一个拼凑。
你是否尝试过调用AudioSessionInitialize并将NULL传递给AudioSessionInterruptionListener(即将处理中断的函数)当你完成它时?
接口如下:
OSStatus AudioSessionInitialize (
CFRunLoopRef inRunLoop,
CFStringRef inRunLoopMode,
AudioSessionInterruptionListener inInterruptionListener,
void *inClientData
);
文档明确地说:
应用程序必须在进行任何其他音频会话服务调用之前调用此函数。你可以根据需要激活或停用你的音频会话(参见AudioSessionSetActive),但应该只初始化一次。