不logging时隐藏iOS应用程序中的红色录制状态栏
当应用程序在后台而不logging时,我无法将红色“录制”状态栏隐藏在我的应用程序中。
我碰巧使用了惊人的audio引擎 ,但我认为这个问题可以解决这个库的知识。 它得到这样的设置:
audioController = [[AEAudioController alloc] initWithAudioDescription:desc inputEnabled:YES]; audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;
当用户想要录制时,我打开这个麦克风:
[audioController addInputReceiver:mic]; audioController.audioSessionCategory = kAudioSessionCategory_PlayAndRecord;
当用户想要停止录制时,我将其closures:
[audioController removeInputReceiver:mic]; audioController.audioSessionCategory = kAudioSessionCategory_MediaPlayback;
问题是,当应用程序没有logging和用户离开应用程序,红色的“录制”状态栏仍然显示。 我无法停止/configurationaudioController,因为应用程序可能仍在播放audio。
如果我不录制,我不想让红色录制状态栏显示。 任何想法如何做到这一点?
更新
我设置了以下代码块,每隔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];
这logging:
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所持有的东西,它不能禁用麦克风。 我没有添加任何input到控制器,所以我不知道它可能是什么。
已解决,请参阅编辑2
只要话筒正在使用,录音与否,酒吧将永远不会消失。 这是一种安全措施,允许用户知道应用程序正在聆听麦克风,而不是显示手机正在录制。
消除这个问题的唯一方法是从input接收器中取出麦克风
我看到你的麦克风没有被移除,必须有一些错误。
要点是,只要麦克风打开,您就不能隐藏红条。
如果你想暂时禁用它,你可以尝试这可能吗?
[audioController setInputEnabled:NO]
你究竟想完成什么? 可能有更好的办法来处理事情
编辑1:添加了其他解决方法
我不知道setInputEnabled是只读的,对不起。
那么,另一个尝试是完全停止控制器,试试这个:
[audioController stop]
如果不是,请尝试释放它,如果你不使用ARC,或者干脆
audioController = Nil;
希望解决这个问题。 但我宁愿试图找出为什么它不是从input接收器删除mic
..也许mic
是零当你调用[audioController removeInputReceiver:mic]
?
编辑2:添加解决scheme
当初始化inputEnabled
设置为YES
,问题就出现了,因为它是readOnly
,不能禁用input,唯一的方法是实际释放audioController
。 如果你使用的是ARC,只要把它设置为[audioController release]
,如果没有,只是[audioController release]
尝试在停止录制时closuresaudio服务 :
AudioSessionSetActive(false);
我解决了这个问题:
- 有两个audio控制器(如评论中所build议的):一个用于logging,另一个用于回放。 当应用程序进入后台,我调用
[recordAudioController stop]
,当我想再次开始录制时,我重新启动了这个audio控制器。 -
从
AEAudioController.m
中删除一行试图停止audio会话的代码,使得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; } }
我知道这个问题有点老了,但如果别人遇到像我这样的问题,我就给了我最后的解决办法。 问题发生在这样的logging情况:
- 开始录制
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
- 停止录制
[session setCategory:AVAudioSessionCategoryPlayback error:&error];
当我注释代码重置会话类别回放时,问题消失。 我也将开始logging代码更改为:
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
使接收机播放的语音播放到扬声器。