我已经为录制音频添加了一个中断通知的观察者。
当执行呼出电话、接收来电但不接听、Siri等操作时,这个功能可以正常工作。
现在我的应用程序正在后台运行,屏幕顶部显示红色条形标志,并且在上述状态下继续录制也没有问题。
但是当我实际接听来电时,会收到另一个AVAudioSessionInterruptionTypeBegan
通知,然后当我停止通话时,我从未收到AVAudioSessionInterruptionTypeEnded
类型的通知。
我尝试使用CTCallCenter来检测何时开始通话,但我无法从该回调重新启动录制。
有谁知道如何让中断机制与实际接听的来电一起工作吗?
这是我正在使用的(部分)代码;
CFNotificationCenterAddObserver(
CFNotificationCenterGetLocalCenter(),
this,
&handle_interrupt,
(__bridge CFStringRef) AVAudioSessionInterruptionNotification,
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately );
...
static void handle_interrupt( CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo )
{
au_recorder *recorder = static_cast<au_recorder*>( observer );
NSNumber* interruptionType = [( ( __bridge NSDictionary* ) userInfo ) objectForKey:AVAudioSessionInterruptionTypeKey];
switch ( [interruptionType unsignedIntegerValue] )
{
case AVAudioSessionInterruptionTypeBegan:
{
// pause recorder without stopping recording (already done by OS)
recorder->pause();
break;
}
case AVAudioSessionInterruptionTypeEnded:
{
NSNumber* interruptionOption = [( ( __bridge NSDictionary* ) userInfo ) objectForKey:AVAudioSessionInterruptionOptionKey];
if ( interruptionOption.unsignedIntegerValue == AVAudioSessionInterruptionOptionShouldResume )
{
recorder->resume();
}
break;
}
}
}
我尝试将通知绑定到AppDelegate、UIViewController和一个独立的类,但似乎没有帮助。
编辑
这是我使用CTCallCenter尝试的内容,但这非常不稳定。当从回调中调用recorder->resume()
时,它要么起作用,要么崩溃,要么根本不做任何事情,直到手动将应用程序放回前台。
callCenter = [[CTCallCenter alloc] init];
callCenter.callEventHandler = ^(CTCall *call)
{
if ([call.callState isEqualToString:CTCallStateDisconnected])
{
recorder->resume();
}
};
CTCallCenter
相关的“暴力崩溃”。 - Rhythmic Fistman