【问题标题】:Hide Red Recording Status Bar In iOS App When Not Recording不录制时隐藏iOS App中的红色录制状态栏
【发布时间】:2013-05-28 13:21:02
【问题描述】:

当应用处于后台且未录制时,我无法将红色的“正在录制”状态栏隐藏在我的应用中。

我碰巧在使用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 坚持使用某些东西,它无法禁用麦克风。我没有向控制器添加任何输入,所以我不知道它可能是什么。

【问题讨论】:

  • this question 不是骗子吗?
  • @H2CO3 不,这个问题是要求在录制时隐藏状态栏。我没有录音。

标签: ios objective-c audio avaudiosession


【解决方案1】:

尝试在停止录制时将audio servicess 设置为关闭:

AudioSessionSetActive(false);

【讨论】:

  • 谢谢 - 值得一试,但没有奏效。当应用在后台时,红条仍会显示。
【解决方案2】:

已解决,请参阅编辑 2

只要麦克风在使用中,无论是否录音,该条都不会消失。这是一种安全措施,让用户知道某个应用正在收听麦克风,而不是显示手机正在录音。

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

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

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

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

[audioController setInputEnabled:NO]

你到底想完成什么?可能有更好的处理方式

编辑 1:添加了其他解决方法

我不知道 setInputEnabled 是只读的,抱歉。

好吧,另一件事是完全停止控制器,试试这个:

[audioController stop]

如果没有,如果您不使用 ARC,请尝试释放它,或者干脆

audioController = Nil;

希望能解决问题。但我宁愿尝试找出为什么它没有从输入接收器中删除mic。也许当你调用[audioController removeInputReceiver:mic]mic 是Nil ??

编辑 2:添加解决方案

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

【讨论】:

  • setInputEnabled:NO 也是我的第一直觉,但它在 AEAudioController 上不存在,除了在构造函数中。我的应用程序播放音频,也可以在用户选择时进行录制。当它进入后台并且用户没有录制时,我希望红色条消失。
  • 我宁愿不释放控制器,因为我可能正在播放音频。我想我可以发布然后初始化一个新的,但这并不理想。疯狂的是,即使我一开始就没有添加输入接收器,我也会得到红条。仅包括inputEnabled:YES 就足以永久显示死亡红条。
  • 这很有意义,因为正如你所说, inputEnabled 是 readonly ,所以它就像一个单向的事情,唯一的方法是 INIT WITH readonly ,当你完成后释放它,不理想当然可以,但没有其他办法。我要做的是初始化两个音频控制器,一个没有输入,一个有输入,然后在它们之间切换,这对你有用吗?
  • 好主意,而且成功了!我担心 AudioSession,但这不是问题。如果您不介意,请更新您的答案,我会将其标记为正确。
  • 对我来说,只有[audioController stop] 就足够了。我不需要audioController = nil 或类似的东西。
【解决方案3】:

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

  • 有两个音频控制器(如 cmets 中所建议的):一个用于录制,一个用于播放。当应用程序进入后台时,我打电话给[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】:

    我知道这个问题有点老了,但如果其他人遇到和我一样的问题,我给出了我的最终解决方案。在这样的录制情况下出现了问题:

    1. 开始录制

    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

    1. 停止录制

    [session setCategory:AVAudioSessionCategoryPlayback error:&error];

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2017-03-20
      相关资源
      最近更新 更多