1

我需要一种在 AudioSession 初始化后更改或禁用 AudioSessionInterruptionListener 的方法。

原因如下:在某些用例中,我的应用程序必须在后台运行并进行录音,因此设置了音频背景模式 - 这很有效。当发生呼叫或其他中断时,我必须通知其他一些对象干净地停止录制 - 这很有效。然后,当应用程序使用我调用的 AudioSession 完成时AudioSessionSetActive(false);- 这有效(如果应用程序在会话处于活动状态的情况下发送到后台,我会在顶部看到红色条,如果会话处于非活动状态,则不会出现红色条。虽然,我猜,从技术上讲,该应用程序仍处于“活动”后台模式)。

然而!如果我完成了录制,并且应用程序已经发送到后台并且音频会话已经被停用,如果有来电,或者如果 Siri 被激活,那么我的应用程序仍然会收到 AudioSessionInterruptionListener 回调。是的,我可以添加代码来测试我的应用程序当前是否应该响应中断。但是,我认为这是一个错误。如果我已停用 AudioSession,则应停止调用中断,实际上应停止调用所有音频会话/属性侦听器。

如何更改或禁用 AudioSessionInterruptionListener?或者用另一种方式来问这个问题,我怎样才能防止我的应用在不需要时“使用”后台模式?

附加信息

好的,似乎在 iOS 6 中现在有 NSNotifications for AudioSession interrupts:AVAudioSessionDidBeginInterruptionNotificationAVAudioSessionDidEndInterruptionNotification. 但是,我支持 iOS 5.1 及更高版本,所以这无济于事。我发现新通知的同一个文档说,Obj-C 接口 AVAudioSession 的委托属性已被贬低(在 IOS 6 中),所以我可能不应该使用它来设置/更改委托(并获取 Obj -C 中断回调)。

我想一个可能的解决方法是测试 iOS 版本并在 <6.0 中设置和取消设置委托,然后在 6.0+ 中侦听 NSNotifications(不会出现在 <6.0 中,因此不应该中断)。然而,这似乎是一个杂牌。

4

1 回答 1

0

完成后,您是否尝试过调用 AudioSessionInitialize 并将 NULL 传递给 AudioSessionInterruptionListener(即将处理中断的函数)?

界面如下:

   OSStatus AudioSessionInitialize (
       CFRunLoopRef                      inRunLoop,
       CFStringRef                       inRunLoopMode,
       AudioSessionInterruptionListener  inInterruptionListener,
       void                              *inClientData
);

该文档明确指出:

在进行任何其他音频会话服务调用之前,您的应用程序必须调用此函数。您可以根据需要激活和停用音频会话(请参阅 AudioSessionSetActive),但应该只初始化一次。

于 2013-07-17T02:34:39.687 回答