不录制时在iOS应用程序中隐藏红色录制状态栏

时间:2013-06-02 01:39:15

标签: ios objective-c audio avaudiosession

当应用在后台并且没有录制时,我无法将红色“录制”状态栏隐藏在我的应用中。

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,因为该应用程序可能仍在播放音频。

如果我没有录制,我不希望显示红色录制状态栏。有任何想法如何做到这一点?

更新

我设置了以下代码块,以便在我的应用中每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 个答案:

答案 0 :(得分:4)

尝试在停止录制时关闭audio servicess

AudioSessionSetActive(false);

答案 1 :(得分:4)

已解决,请参阅编辑2

只要麦克风正在使用,录音与否,该栏就不会消失。这是一项安全措施,允许用户知道应用正在收听麦克风,而不是显示手机正在录制。

让它消失的唯一方法是从输入接收器中移除麦克风

我看到你的麦克风没有被移除,必须有一些错误。

重点是,只要麦克风打开,就无法隐藏红色条。

如果你想暂时禁用它,你可以尝试这个吗?

[audioController setInputEnabled:NO]

无论如何,你想要完成什么?可能有更好的方法来处理事情

修改1:添加了其他解决方法

我不知道setInputEnabled是readonly,抱歉。

嗯,另外要尝试的是完全停止控制器,试试这个:

[audioController stop]

如果没有,请尝试释放它,如果您不使用ARC,或只是

audioController = Nil;

希望解决问题。但我宁愿试着找出它为什么不从输入接收器中删除mic ..当你调用mic时,[audioController removeInputReceiver:mic]可能是Nil?

编辑2:添加解决方案

当您将inputEnabled设置为YES进行初始化时出现问题,因为它是readOnly,您无法禁用输入,唯一的方法是实际释放audioController }。 如果你使用ARC,只需将其设置为Nil,如果没有,只需[audioController release]

答案 2 :(得分:0)

我通过以下方式解决了问题:

  • 有两个音频控制器(如评论中所示):一个用于录制,一个用于播放。当应用程序进入后台时,我调用了[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;
    }
    }
    

答案 3 :(得分:0)

我知道问题有点老了,但是如果其他人遇到像我这样的问题,我给出了最后的解决方案。问题出现在这样的录音情况中:

  1. 开始录制
  2. [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

    1. 停止录制
    2. [session setCategory:AVAudioSessionCategoryPlayback error:&error];

      当我评论将会话类别重置为播放的代码时,问题就消失了。我还将开始录制代码更改为:

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

      使声音从接收器播放到扬声器。