Скрыть красную строку состояния записи В приложении 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];
- остановить запись
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
когда я комментирую код, что reset категория сеанса для воспроизведения, проблема исчезла. Я также меняю начальный код записи на:
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
чтобы голос воспроизводился с приемника на динамик.