我需要一种方法来在AudioSession初始化之后更改或禁用AudioSessionInterruptionListener。
原因如下:在某些用例中,我的应用必须在后台运行音频录制,因此设置了音频后台模式 - 这是有效的。当发生呼叫或其他中断时,我必须通知其他一些对象干净地停止录制 - 这是有效的。然后,当我使用AudioSession完成应用程序时,我调用AudioSessionSetActive(false);
- 这是有效的(如果应用程序在会话处于活动状态时发送到后台,我会在顶部显示红色条,如果会话处于非活动状态,则为红色bar没有出现。虽然,我猜,从技术上讲,应用程序仍然处于“活动”背景模式。)
然而!如果我已完成录制,并且应用程序已被发送到后台并且音频会话已被停用,如果有来电,或者Siri已激活,那么我的应用程序仍然会收到AudioSessionInterruptionListener回调。是的,我可以添加代码来测试我的应用程序当前是否应该响应中断。但是,我认为这是一个错误。如果我已停用AudioSession,则应停止调用中断,实际上所有音频会话/属性侦听器都应该停止被调用。
如何更改或禁用AudioSessionInterruptionListener?或者也许是另一种方式来问这个问题,如何防止我的应用程序在不需要时“使用”后台模式?
其他信息
好的,似乎在iOS 6中现在有针对AudioSession中断的NSNotifications:AVAudioSessionDidBeginInterruptionNotification
和AVAudioSessionDidEndInterruptionNotification
。但是,我支持iOS 5.1及更高版本,所以这没有帮助。我发现新通知的相同文档说Obj-C接口AVAudioSession的委托属性是折旧的(在IOS 6中),所以我可能不应该使用它来设置/更改委托(并获取Obj) -C中断回调)。
我想可能的解决方法是测试iOS版本和< 6.0设置和取消设置委托,然后在6.0+中监听NSNotifications(不会出现在< 6.0中,所以不应该不要破坏。然而,这看起来像是一块垃圾。
答案 0 :(得分:0)
您是否尝试过调用AudioSessionInitialize并在完成后将NULL传递给AudioSessionInterruptionListener(即将处理中断的函数)?
界面如下:
OSStatus AudioSessionInitialize (
CFRunLoopRef inRunLoop,
CFStringRef inRunLoopMode,
AudioSessionInterruptionListener inInterruptionListener,
void *inClientData
);
文档明确说:
您的应用程序必须在进行任何其他音频会话服务调用之前调用此函数。您可以根据需要激活和停用音频会话(请参阅AudioSessionSetActive),但只应初始化一次。