应用程序录制音频,并在出现中断(例如电话呼叫)时停止录制音频,然后在电话结束时恢复录制音频。
该应用程序当前在有电话时注册,但是当我挂断电话时,该应用程序没有注册中断已结束。(我没有打开其他应用程序)。
使用函数委托
在我的 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")
}
}
对我不起作用的相关解决方案
- 解决方案:添加
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
哪个不起作用 - 解决方案:使用
MixWithOthers
,这可能适用于恢复播放音频,但在我的情况下不适用于恢复录制音频
当前假设
我目前的假设是,“结束”中断仅适用于诸如当您接到电话并且您拒绝接听电话时的中断,而不适用于您实际拿起电话,聊了一会儿然后挂断的中断。我的猜测是,如果不使用越狱手机,就无法检测到后一种情况。
在这里以更广泛的方式进行了扩展:iOS AVAudioSession 中断通知未按预期工作
这个假设似乎在DropVox 的常见问题解答中得到了验证:
一次只有一个应用程序可以控制音频。如果 DropVox 正在录制并且另一个应用程序控制,这称为“中断”。中断结束后,DropVox 只有在前台7才能恢复录制,这就是为什么我们提醒不要使用“后台录制”设置的原因。
我可以通过使用路由来检测正在使用的麦克风来处理中断。但我不认为我可以在后台重新激活录音,所以一旦应用程序回到前台,我就会这样做。
那正确吗?