4

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

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

使用函数委托

在我的 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,这可能适用于恢复播放音频,但在我的情况下不适用于恢复录制音频

当前假设

我目前的假设是,“结束”中断仅适用于诸如当您接到电话并且您拒绝接听电话时的中断,而不适用于您实际拿起电话,聊了一会儿然后挂断的中断。我的猜测是,如果不使用越狱手机,就无法检测到后一种情况。

在这里以更广泛的方式进行了扩展:iOS AVAudioSession 中断通知未按预期工作

这个假设似乎在DropVox 的常见问题解答中得到了验证:

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

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

那正确吗?

4

1 回答 1

-2

DO NOT active audiosession in applicationWillResignActive:/applicationDidBecomeActive: function !

when the phone call reached, the system own the audiosession,at this time if you call function [[AVAudioSession sharedInstance] setActive:YES error:&error] in the applicationWillResignActive:/applicationDidBecomeActive: function ,your app will own the audiosession back(actually it should be fail to active audiosession when the phone call,but I don't know why it return true) and will not receive the end interruption.

于 2016-08-01T08:55:12.370 回答