在电话呼叫期间处理中断 - “开始”有效,但“结束”不起作用

时间:2016-01-12 20:07:26

标签: ios swift avaudiorecorder avaudiosession interruptions

该应用程序会录制音频,并应在中断(例如电话)时停止录制音频,然后在电话结束时恢复录制音频。

当有电话时,应用程序当前会注册,但是当我挂断电话时,应用程序不会注册中断已经结束。 (我没有其他应用程序打开)。

使用功能代理

请参阅我的ViewController中的以下代码。

func audioRecorderBeginInterruption(recorder: AVAudioRecorder){
    print("* * * * * * * inside begin interruption")}

func audioRecorderEndInterruption(recorder: AVAudioRecorder, withFlags flags: Int) {
    // THIS NEVER PRINTS, EVEN WHEN PHONE IS HUNG UP
    print("* * * * * * * inside end interruption")
}

使用通知

我也尝试过处理通知中断,但是仍然没有处理.Ended,除非我接到电话而拒绝通话。请参阅我的AppDelegate中的代码

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let center = NSNotificationCenter.defaultCenter()

        center.addObserver(self,
            selector:"sessionInterrupted:",
            name:AVAudioSessionInterruptionNotification,
            object:AVAudioSession.sharedInstance()) //self.myViewController.audioSession)


        return true
    }



 func sessionInterrupted(notification: NSNotification){
                if let typeValue = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? NSNumber{
                    if let type = AVAudioSessionInterruptionType(rawValue: typeValue.unsignedLongValue){
                        if type == .Began{
                            print("interruption: began")
                        } else{
                            // THIS ALSO NEVER PRINTS
                            print("interruption: ended")
                        }
        }

对我不起作用的相关解决方案

  1. 解决方案:添加无效的[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
  2. 解决方案:使用MixWithOthers,这可能有助于恢复播放音频,但在我的情况下无法恢复录制音频
  3. 当前假设

    我目前的假设是,“结束”中断仅用于中断,例如当您接到电话时,您拒绝接听电话,但不是因为如果您实际接听电话,请稍微说话,然后挂断。我的猜测是,如果不使用越狱手机,就无法检测后一种情况。

    在这里以更广泛的方式扩展:iOS AVAudioSession interruption notification not working as expected

    此假设似乎已在DropVox's FAQ中验证:

      

    一次只有一个应用程序可以控制音频。如果DropVox正在录制   另一个应用程序控制,这被称为“中断”   中断结束了,DropVox才有可能恢复   记录它是否在前景7,这就是我们提醒的原因   使用“在后台录制”设置。

    我可以通过使用routing来检测正在使用的麦克风来处理中断。但我不认为我可以在后台重新激活录音,所以一旦应用程序回到前台,我就会这样做。

    是吗?

1 个答案:

答案 0 :(得分:-2)

不要#warning函数中激活音频!

当电话呼叫到达时,系统拥有音频会话,此时如果您在applicationWillResignActive:/applicationDidBecomeActive:功能中调用功能[[AVAudioSession sharedInstance] setActive:YES error:&error],您的应用将拥有音频会话(实际上它应该是失败的电话时主动发送音频,但我不知道它为什么会返回真实状态,并且不会收到结束中断。