Скрыть красную строку состояния записи В приложении iOS, когда нет записи

Я не могу получить красную строку состояния "Запись", чтобы скрыть свое приложение, когда приложение находится в фоновом режиме и не записывается.

enter image description here

Я использую The Amazing Audio Engine, но я думаю, что этот вопрос можно было бы решить, узнав об этой библиотеке. Он настраивается следующим образом:

audioController = [[AEAudioController alloc] initWithAudioDescription:desc inputEnabled:YES];
audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;

Когда пользователь хочет записать, я включаю микрофон следующим образом:

[audioController addInputReceiver:mic];
audioController.audioSessionCategory = kAudioSessionCategory_PlayAndRecord;

Когда пользователь хочет остановить запись, я отключу его:

[audioController removeInputReceiver:mic];
audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;

Проблема заключается в том, что, когда приложение не записывается и пользователь покидает приложение, красная строка состояния "Запись" все еще отображается. Я не могу остановить/отключить audioController, потому что приложение все еще может воспроизводить аудио.

Я не хочу, чтобы красная строка состояния отображалась, если я не записываю. Любые идеи, как это сделать?

Update

Я настраиваю следующий блок кода для запуска каждые 2 секунды в своем приложении.

audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError* error = nil;
[audioSession setActive:NO error: &error];
NSLog(@"error: %@", error);
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

Этот журнал:

TAAE: Setting audio session category to MediaPlayback
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput)    result 2003329396 77686174 what
Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn’t be completed. (OSStatus error 560030580.)"

Очевидно, что он не может отключить микрофон из-за чего-то, к чему ТААЕ держится. Я не добавил никаких входов в контроллер, поэтому я не знаю, что это может быть.

Ответы

Ответ 1

Разрешено, см. edit 2

Бар никогда не исчезнет, ​​пока микрофон используется, записывается или нет. это мера безопасности, позволяющая пользователю узнать, что приложение слушает микрофон, а не показывать, что телефон записывает.

Единственный способ получить это - удалить микрофон с входных приемников

Я вижу, что ваш микрофон не удаляется, должна быть какая-то ошибка.

Точка, вы не можете скрыть красную полосу, пока микрофон открывается.

если вы хотите временно отключить его, вы можете попробовать это, может быть?

[audioController setInputEnabled:NO]

Что вы пытаетесь достичь в любом случае? может быть лучший способ справиться с вещами

Изменить 1: добавлены другие обходные пути

Я не знал, что setInputEnabled был только для чтения, извините.

Ну, еще одна попытка - полностью остановить контроллер, попробуйте следующее:

[audioController stop]

Если нет, попробуйте освободить его, если вы не используете ARC, или просто

audioController = Nil;

Надеюсь, что это проблема. но я скорее попытаюсь выяснить, почему он не удаляет mic из входных приемников.. возможно, mic - это Nil, когда вы вызываете [audioController removeInputReceiver:mic]??

Изменить 2: добавлено решение

Проблема возникает, когда вы инициализируетесь с inputEnabled, установленным на YES, так как он readOnly, вы не можете отключить ввод, единственный способ - фактически освободить audioController. если вы используете ARC, просто установите его на Nil, если нет, просто [audioController release]

Ответ 2

Попробуйте установить аудио-сервис при прекращении записи:

AudioSessionSetActive(false);

Ответ 3

Я решил проблему:

  • Наличие двух аудиоконтроллеров (как указано в комментариях): один для записи и один для воспроизведения. Когда приложение запустило фон, я позвонил [recordAudioController stop], и когда я захотел начать запись снова, я перезапустил этот аудиоконтроллер.
  • Удаление строки кода из AEAudioController.m, которая пыталась остановить сеанс аудио, заставляя TAAE останавливать только AUGraph:

    - (void)stopInternal {
    NSLog(@"TAAE: Stopping Engine");
    
    checkResult(AUGraphStop(_audioGraph), "AUGraphStop");
    
    if ( self.running ) {
        // Ensure top IO unit is stopped (AUGraphStop may fail to stop it)
        checkResult(AudioOutputUnitStop(_ioAudioUnit), "AudioOutputUnitStop");
    }
    
    // --- I removed the following section ---
    if ( !_interrupted ) {
        NSError *error = nil;
    
        if ( ![((AVAudioSession*)[AVAudioSession sharedInstance]) setActive:NO error:&error] ) {
            NSLog(@"TAAE: Couldn't deactivate audio session: %@", error);
        }
    }
    
    processPendingMessagesOnRealtimeThread(self);
    
    if ( _pollThread ) {
        [_pollThread cancel];
        while ( [_pollThread isExecuting] ) {
            [NSThread sleepForTimeInterval:0.01];
        }
        _pollThread = nil;
    }
    }
    

Ответ 4

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

  • начать запись

[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

  1. остановить запись

[session setCategory:AVAudioSessionCategoryPlayback error:&error];

когда я комментирую код, что reset категория сеанса для воспроизведения, проблема исчезла. Я также меняю начальный код записи на:

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];

чтобы голос воспроизводился с приемника на динамик.