Невозможно переключиться на выход динамика, когда подключены Bluetooth-гарнитуры - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь разрешить переключение между bluetooth-гарнитурами (в моем случае airpods) и динамиком телефона, используя AVAudioSession.Я инициализирую свою сессию следующим образом:

AVAudioSessionCategoryOptions options = (AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionDefaultToSpeaker);
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:options error:&error];

Затем я пытаюсь переключаться между режимами вывода следующим образом:

-(void)setIncomingSoundMode:(IncomingSoundMode)incomingSoundMode{
    [self removeAudioRouteChangedObserver];


    [NNLogger logFromInstance: self message: @"Audio stream setting use speaker" data: @(incomingSoundMode)];
    _incomingSoundMode = incomingSoundMode;


    AVAudioSession *session = [AVAudioSession sharedInstance];
    AVAudioSessionPortDescription *routePort = session.currentRoute.outputs.firstObject;
    NSString *portType = routePort.portType;
    NSLog(@"current port type: %@",portType);


    NSError *audioPortError = nil;
    if(incomingSoundMode == IncomingSoundModeSpeaker){
        [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&audioPortError];
        [self muteChannel:NO];
    } else if(incomingSoundMode == IncomingSoundModeHeadset){
        [session overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&audioPortError];
        [self muteChannel:NO];
    } else if(incomingSoundMode == IncomingSoundModeBluetooth){
        [session overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&audioPortError];
        [self muteChannel:NO];
    } else if(incomingSoundMode == IncomingSoundModeSilent){
        [self muteChannel:YES];
    }

    if(audioPortError){
        NSLog(@"audioPortError - %@",audioPortError.localizedDescription);
    }
    NSError *sessionError = nil;
    [session setActive: YES error:&sessionError];
    if(sessionError){
        NSLog(@"sessionError - %@",sessionError.localizedDescription);
    }

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self addAudioRouteChangedObserver];
    });

}

Проблема заключается в том, когда я пытаюсь переопределить вывод на динамик, когда наушники Bluetoothподключены - он просто не переключается на динамик.Эта же функциональность работает с проводными наушниками или при переключении динамика устройства на гарнитуру:

[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&audioPortError];
[session setActive: YES error:&sessionError];

Любые подсказки о том, что я делаю не так здесь ??

Спасибо

1 Ответ

0 голосов
/ 17 июня 2019

У меня точно такая же проблема в приложении, над которым я работаю, и оно воспроизводится только на iOS 12+ и только для устройств Bluetooth с чипом W1 / H1 (AirPods / new Beats Studio и т. Д.).

Я спросил об этом яблочных инженеров из WWDC (показав мой отчет об ошибках), и они подтвердили, что это известная проблема, над которой они работают.Должно быть исправлено в обновлении iOS ... когда-нибудь позже :) Чтобы ускорить процесс, вы можете продублировать этот отчет об ошибке: rdar: // 49734534

PS Для этой проблемы нет подходящего решения, но есть несколько вариантов:

  1. Используйте кнопку маршрута MPVolumeView.Это работает, и похоже, что именно так WhatsApp обрабатывает этот случай.
  2. Отключить функцию Bluetooth для AVAudioSession.Далеко не идеальное решение, но может работать для некоторых приложений.
...