7

触发时applicationDidEnterBackground:,我暂停正在播放的音频AVAudioPlayer

[self.avPlayer pause];

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

这是怎么回事?这发生在 iPad 2 上的 iOS 6.x 中。此问题不会在运行 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];
4

5 回答 5

1

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

在您处理播放器代码的类中注册它

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

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

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags

希望这可以帮助。

于 2013-07-08T13:38:51.893 回答
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 
于 2016-01-27T06:15:20.010 回答
0

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

于 2014-06-04T10:29:14.273 回答
0

我也面临同样的问题。因此,我为UIApplicationWillResignActive注册了我的课程,并在收到通知时暂停了音频。

于 2017-03-28T11:42:01.437 回答
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
}

通常你会这样做,因为你通常只是暂停。

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

好像没有别的办法了。

于 2020-02-26T15:16:35.953 回答