暂停的音频开始在applicationWillEnterForeground上自动播放:

时间:2013-07-08 12:07:16

标签: ios avaudioplayer avaudiosession

applicationDidEnterBackground:触发时,我会暂停使用AVAudioPlayer播放的音频:

[self.avPlayer pause];

现在,当applicationWillEnterForeground:触发时,音频会自动开始播放!由于我没有启动音频,因此用户界面未更新,并且显示音频仍处于暂停状态。

发生了什么事?这种情况发生在iOS 6.x,iPad 2上。这个问题不能在运行iOS 5.x的旧版iPad上重现。

这是我设置AVAudioSession

的方法
// Setup the audio session
BOOL succeeded = NO;
NSError *sessionError = nil;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setDelegate:self];

if ([session respondsToSelector:@selector(setPreferredSampleRate:error:)]) {
    succeeded = [session setPreferredSampleRate:128000.0f error:&sessionError];

} else {
    succeeded = [session setPreferredHardwareSampleRate:128000.0f error:&sessionError];
}

succeeded = [session setCategory:AVAudioSessionCategorySoloAmbient error:&sessionError];
succeeded = [session setActive:YES error:&sessionError];

5 个答案:

答案 0 :(得分:1)

在我最近的一个应用程序中,我发现了一个类似的问题,音频播放自动暂停,并在您被呼叫打断后恢复,并且我的应用程序中的GUI没有刷新。我已使用以下方法解决了该问题:

在处理播放器代码的课程中注册

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

使用AVAudioSession的{​​{1}}委托方法在应用程序恢复后获得控制权。在此功能中,您可以相应地恢复播放和更新UI。

audioPlayerEndInterruption

希望这有帮助。

答案 1 :(得分:1)

我发现了一些奇怪的用户体验,当我从后台来回走动并根据一堆帖子时,我计划稍微摇晃一下手柄。我做了一件相当简单的事 - 检查应用程序进入前台时是否正在播放其他音乐:

    func applicationWillEnterForeground(application: UIApplication) {
         if AVAudioSession.sharedInstance().otherAudioPlaying{                 
NSNotificationCenter.defaultCenter().postNotificationName(Notifications.ForegroundEnteredWithOtherAudioPlaying, object: nil)
         }
    }

如果是,您可以在收到通知时暂停播放器。你提到它没有用,但没有看到你的其余代码,很难知道原因。

我要做的另一件事就是从播放器项中删除status标志的观察者,因为我听到ReadyToPlay值,我告诉AvPlayer实际上玩。当应用程序进入前台并且存在活动的音频会话时会被触发。因此,通过在暂停时移除观察者并在每次进场时设置它(这并不是因为我认为这是一个好的约束,说我打算在玩之后只注意观察) ,我能够控制很多怪异。

我还写了一堆测试用例,我将在这里分享,以确保您的体验状态良好。它并不全面,但它也相当彻底。

    // 1. Play, leave app, don't open anything else, come back
    // 2. Play, leave app, open an app that plays music, come back
    // 3. Play, leave app, open an app that plays music, play music, come back
    // 4. Play, let audio go for 5 seconds, pause, open an app that plays music, come back
    // 5. Play, let audio go for 5 seconds, pause, open an app that plays music, play music, come back
    // 6. Press play, leave app before playback starts, open an app that plays music, come back
    // 7. Crazy s$*t like play, leave app, open an app that plays music, play music, come back, tap a different song 

答案 2 :(得分:0)

HRM的解决方案对我不起作用。我得到它以避免自动恢复播放的唯一方法是使用stop:[self.avPlayer stop]

答案 3 :(得分:0)

我也遇到了同样的问题。所以我在 UIApplicationWillResignActive 上注册了我的班级,并在收到通知时暂停了音频。

答案 4 :(得分:0)

2020,仍然没有解决办法吗?

关于这个荒谬的问题。这似乎确实是iOS中的一个普通错误。

我们能找到的唯一真正的解决方案

在所有三个委托调用中..

func applicationWillResignActive(_ application: UIApplication) {
    yourPlayer.handleAppResign()
}

func applicationDidEnterBackground(_ application: UIApplication) {
    yourPlayer.handleAppResign()
}

func applicationWillTerminate(_ application: UIApplication) {
    yourPlayer.handleAppResign()
}

然后在处理该特定案件的地方,您将拥有:

func ...handleThat() {
    yourAVPlayer?.rate = 0
}

实际上只需添加以下内容:

func ...handleThat() {
    yourAVPlayer?.rate = 0
    yourAVPlayer = nil
}

通常您不会这样做,因为您通常只是暂停一下。

但是,实际上,这似乎是疯狂的“苹果自动取消暂停”行为的唯一解决方案。

似乎没有其他办法。