Callkit使用蓝牙耳机作为音频输出

时间:2017-07-07 09:41:33

标签: ios audio bluetooth voip callkit

我正在使用Callkit工作VOIP 除音频输出源外,它工作正常 它始终通过iPhone扬声器输出音频

其中一些答案说AvAudioSession Option设置为AVAudioSessionCategoryOptionAllowBluetooth,但仍然失败 我尝试将蓝牙耳机设置为首选,如this,失败

顺便问一下,如何通过耳机播放铃声? 下面是我的代码,按照此discussion中的建议,我在拨打电话后立即配置AVAudioSession

- (void)getCall:(NSDictionary *)infoDic {

    CXCallUpdate *update = [[CXCallUpdate alloc]init];
    // config update

    NSUUID *uuid = [NSUUID UUID];
    [self.provider reportNewIncomingCallWithUUID:uuid update:update completion:^(NSError * _Nullable error) {
        if (error)
            NSLog(@"%@", error.localizedDescription);
    }];

    NSArray *video = @[@(ReceiveVideoReq), @(VideoCalling)];
    if ([video containsObject:@(self.client.callStage)])
        [ProviderManager configureAudio:true];
    else
        [ProviderManager configureAudio:false];
}

- (void)dialPhone:(BOOL)isVideo {

    CXHandle *handle = [[CXHandle alloc]initWithType:CXHandleTypePhoneNumber value:@"AAAA"];
    CXStartCallAction *start = [[CXStartCallAction alloc]initWithCallUUID:uuid handle:handle];
    start.video = isVideo;
    CXTransaction *trans = [[CXTransaction alloc]initWithAction:start];
    [self callControlReq:trans];

    [ProviderManager configureAudio:isVideo];
}

+ (void)configureAudio:(BOOL)isVideo {
    NSError *error=nil, *sessionError = nil;
    AVAudioSession *sess = [AVAudioSession sharedInstance];

    [sess setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionAllowBluetoothA2DP error:&sessionError];
    if (sessionError)
        NSLog(@"ERROR: setCategory %@", [sessionError localizedDescription]);

    if (isVideo)
        [sess setMode:@"AVAudioSessionModeVideoChat" error:&sessionError];
    else
        [sess setMode:@"AVAudioSessionModeVoiceChat" error:&sessionError];
    if (sessionError) {
        NSLog(@"ERROR: setCategory %@", [sessionError localizedDescription]);
    }

    [sess overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&sessionError];
    [[AVAudioSession sharedInstance] setActive:true withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

}

1 个答案:

答案 0 :(得分:0)

经过研究,我发现了此问题的根本原因。 打开设置->辅助功能->触摸->呼叫音频路由,共有三个选项:自动,蓝牙耳机,扬声器。 默认为自动,这意味着如果您接听电话(包括callkit),则当您通过蓝牙设备接听电话时,音频将路由至蓝牙,如果您在iPhone中接听电话,则将路由至接收方。 因此,这实际上不是问题,而只是系统行为。

也不要尝试使用[AVAudioSession setPreferredInput:]强制切换到蓝牙,这将导致更严重的问题。 以我的情况为例:在音频连接后,我将此强制开关切换为蓝牙,它起作用了,但是当蓝牙设备断开连接时,我的音频完全不起作用,并且应用程序没有得到任何音频路由更改回调,甚至在再次连接蓝牙设备后也无法正常工作。 / p>