Скрыть красную строку состояния записи в приложении iOS, когда она не записывается
Я не могу получить красную строку состояния "запись", чтобы скрыть в моем приложении, когда приложение находится в фоновом режиме, а не запись.
Я с помощью Удивительный Аудио Двигатель, но я думаю, что этот вопрос может быть решен знанием этой библиотеки. Он получает настройку следующим образом:
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; } }
Я знаю, что вопрос был немного старым, но в случае, если другие люди столкнулись с той же проблемой, как я, я дал свое окончательное решение. Проблема возникла в такой ситуации записи:
- начать запись
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
- остановить запись
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
когда я комментирую код, который сбрасывает категорию сеанса на воспроизведение, проблема исчезла. Я также изменяю код начала записи кому:
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
Так что голос играл от приемника к динамику.