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

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

enter image description here

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

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

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

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

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

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

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

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

обновление

настройки следующий блок кода для запуска каждые 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.)"

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

4 ответов


решено, см. edit 2

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

единственный способ получить его ушел, чтобы удалить микрофон от входных приемников

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

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

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

[audioController setInputEnabled:NO]

что вы пытаетесь сделать в любом случае? возможно, есть лучший способ справиться с этим!--15-->

Edit 1: добавлены другие обходные пути

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

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

[audioController stop]

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

audioController = Nil;

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

Edit 2: добавлено решение

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


попробуйте установить аудио услуги выкл при остановке записи:

AudioSessionSetActive(false);

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

  • наличие двух звуковых контроллеров (как предложено в комментариях): один для записи и один для воспроизведения. Когда приложение вошло в фон, я позвонил [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;
    }
    }
    

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

  1. начать запись

[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

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

[session setCategory:AVAudioSessionCategoryPlayback error:&error];

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

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

Так что голос играл от приемника к динамику.