8

我有一个带有音乐播放器的 iOS7 应用程序。我正在使用以下代码检查 MPMusicPlayerController 的播放状态更改以更新 UI。更准确地说,我在播放和暂停之间切换播放按钮的外观。

[[NSNotificationCenter defaultCenter] addObserver: self
                   selector: @selector (handle_NowPlayingItemChanged:)
                       name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
                     object: self.musicPlayer];

[[NSNotificationCenter defaultCenter] addObserver: self
                   selector: @selector (handle_PlaybackStateChanged:)
                       name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
                     object: self.musicPlayer];

[self.musicPlayer beginGeneratingPlaybackNotifications];

如果我在 iPad 或 iPhone 上的 iOS7 上运行该应用程序,我会得到以下序列,而不仅仅是一个回调:

-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2

播放状态 2 表示 MPMusicPlaybackStatePaused 并导致我的应用程序在 UI 中显示错误的状态,而歌曲实际上正在播放。回调被调用 4 次,使用交替值是没有意义的。

仅在更改队列时会发生这种情况。看起来系统没有正确清除队列。

关于如何解决这个问题的任何想法?

4

4 回答 4

4

我有同样的问题。我找到了这个解决方法,而不是使用playbackState来检查音频是否正在播放,我使用了这个条件:

if([[AVAudioSession sharedInstance] isOtherAudioPlaying])

于 2014-02-18T18:42:17.027 回答
4

自 iOS 7 发布以来,我一直遇到同样的问题。这绝对是 iOS 的问题。它不仅报告不正确的播放状态,而且有时无法接收播放状态更改通知 ( MPMusicPlayerControllerPlaybackStateDidChangeNotification)

我已经向 Apple 报告了这个错误,我建议你做同样的事情 ( Apple Bug Reporter )

于 2013-09-20T11:13:45.990 回答
3

另一种解决方法是检查:

    if([[MPMusicPlayerController iPodMusicPlayer] currentPlaybackRate] == 0)
于 2014-02-19T14:24:33.173 回答
2

解决方法取决于您对回调的实现。我所做的如下:

(1)抑制队列更改期间的回调。因此,我有一个 BOOL ivar doNotNoteNowPlayingItem。一个示例回调是这样开始的:

    if (self.doNotNoteNowPlayingItem) // flag to prevent
        return;

因此,当我要更改队列时,我升起标志,将此 ivar 设置为 YES,并在我即将设置时再次降低它nowPlayingItem并准备再次回调。其他回调将类似地工作。

(2)不要用来playbackState作为我们是否正在播放和暂停的测试。如果我们被停止,答案将是正确的,但如果我们正在播放,则可能会报告答案为暂停。要区分播放和暂停,请检查currentPlaybackRate; 如果它接近 1,我们正在播放,但如果它接近 0,我们将暂停。

于 2014-05-21T02:12:47.353 回答