【问题标题】:How to interrupt AVPlayer for incoming call manually如何手动中断 AVPlayer 来电
【发布时间】:2013-10-10 04:30:24
【问题描述】:

我已经使用这个方法How do I get my AVPlayer to play while app is in background? 在后台播放 AVPlayer,这样用户就可以在浏览 safari 等时收听。唯一的问题是现在 AVPlayer 在有来电时继续播放,并在通话期间继续播放.有没有办法捕捉来电和结束通话事件,以便手动停止和启动 AVPlayer?

【问题讨论】:

    标签: objective-c background-process avplayer phone-call


    【解决方案1】:

    通过coreTelephony 框架,我们必须找到或检测来电。从那里您必须启动本地通知以停止您的AVPlayer。 导入后这样做

         CTCallCenter * _callCenter = [[CTCallCenter alloc] init];
        _callCenter.callEventHandler = ^(CTCall* call)
        {
    
            if ([call.callState isEqualToString:CTCallStateDisconnected])
            {
                NSLog(@"Call has been disconnected");
            }
            else if([call.callState isEqualToString:CTCallStateDialing])
            {
                NSLog(@"Call start");
            }
            else if ([call.callState isEqualToString:CTCallStateConnected])
            {
    
              NSLog(@"Call has just been connected");
            }
            else if([call.callState isEqualToString:CTCallStateIncoming])
            {
                NSLog(@"Call is incoming");
                // You have to initiate/post your local notification through NSNotification center like this 
            [[NSNotificationCenter defaultCenter] postNotificationName:@"stopAVPlayer" object:nil];
            } else
            {
                NSLog(@"None of the conditions");
            }
    
    
        };
    

    请参考:https://developer.apple.com/library/ios/navigation/#section=Frameworks&topic=CoreTelephony

    【讨论】:

    • 该链接中似乎缺少示例代码。是否应该在 AppDelegate 中创建 CTCallCenter 并通过 NSNotificationCenter 与 ViewController 方法进行通信?还是可以在 View Controller 中与 AVPlayer 实例一起创建?
    【解决方案2】:

    您现在可以使用 CallKit 来获取电话事件。 (iOS 10.0+) 这对我有好处。

    #import <CallKit/CallKit.h>
    
    @interface ViewController ()<CXCallObserverDelegate> {
        CXCallObserver *_center;
    }
    

    -(void)viewDidLoad

    _center = [[CXCallObserver alloc] init];
    dispatch_queue_t queue = dispatch_queue_create("THIS_IS_A_CALL",NULL);
    [_center setDelegate:self queue:queue];
    

    委托

    - (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
    
        NSString *tag = @"callObserver";
        NSString *content = @"";
    
        if (call.isOutgoing) {
            content = @"call.isOutgoing";
        }
        if (call.hasEnded) {
            content = @"call.hasEnded";
        }
    
        if (call.hasConnected) {
            content = @"call.hasConnected";
        }
    
        if (call.isOnHold) {
            content = @"call.isOnHold";
        }
        NSLog(@"%@ - %@", tag, content);
    }
    

    更多详情:https://developer.apple.com/documentation/callkit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      相关资源
      最近更新 更多