8

我在 MP 音乐播放器中的播放状态错误。在播放歌曲时,我处于暂停状态。我的应用程序在 ios 4 中运行良好,但我在 ios 5 中遇到了这个问题。有人可以帮帮我吗?

我的代码在这里。

[musicPlayer stop];
if (userMediaItemCollection)
{
   userMediaItemCollection=nil; 
}
musicPlayer.nowPlayingItem=nil;

userMediaItemCollection=[MPMediaItemCollection collectionWithItems:[mediaItemCollection    items]];

[musicPlayer setQueueWithItemCollection:userMediaItemCollection];
[musicPlayer setNowPlayingItem:    
[[userMediaItemCollectionitems]objectAtIndex:indexOfCurrentObject]];
[self enablePrevAndNextButtons];

[musicPlayer play];        
}

-(void)playbackStateDidChanged:(NSNotification *)notification
{

 if (musicPlayer.playbackState!=MPMusicPlaybackStatePlaying)
 {
    [playPauseButton setBackgroundImage:[UIImage imageNamed:@"play_iPad.png"] forState:UIControlStateNormal];
 }
 else if(musicPlayer.playbackState==MPMusicPlaybackStatePlaying)
 {
    [playPauseButton setBackgroundImage:[UIImage imageNamed:@"pause_iPad.png"] forState:UIControlStateNormal];
 }
4

5 回答 5

4

我也向 Apple 报告了这个错误。通过执行以下操作,我能够 100% 地重现它:

启动使用 MPMusicPlayerController 的应用程序。启动“音乐”应用程序。点击播放,跳过,跳过,暂停,播放,暂停 打开原始应用程序,MPMusicPlayerController 的 MPMusicPlaybackState 将不正确。

这里提出的解决方案都不适合我。有效的解决方案是跟踪错误发生的时间并在这些情况下特别更新 UI。

收到UIApplicationDidBecomeActiveNotification通知后(有关更多详细信息,请参阅 matbur 帖子),查看当 MPMusicPlaybackState 说它是时音频是否实际上没有播放:

-(BOOL) isPlaybackStateBugActive {
    MPMusicPlaybackState playbackState = self.musicPlayer.playbackState;
    if (playbackState == MPMusicPlaybackStatePlaying) {
        AudioSessionInitialize (NULL, NULL, NULL, NULL);
        UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
        AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
        AudioSessionSetActive (true);

        UInt32 audioIsPlaying;
        UInt32 size = sizeof(audioIsPlaying);
        AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &size, &audioIsPlaying);

        if (!audioIsPlaying){
            NSLog(@"PlaybackState bug is active");
            return YES;
        }
    }

    return NO;
}

不要忘记导入 AudioToolbox 框架。

于 2012-11-18T20:36:50.397 回答
3

这些变通办法都不能解决我的应用程序的问题。这是 iOS 中的一个错误,在 Apple 修复它之前,我的应用程序将永远无法正常运行。

我有一个带有播放/暂停按钮的音乐播放器。播放音乐时,按钮显示“暂停”图标。当音乐暂停时,按钮会显示“播放”图标 - 就像所有音乐应用程序一样。我可以通过执行以下操作随时复制该错误:1. 在我的应用程序中播放音乐(播放/暂停按钮正确显示“暂停”图标) 2. 后台我的应用程序并锁定我的手机约 10 分钟 3. 加倍点击主页并点击 iPod 控件中的暂停按钮 4. 解锁我的手机并再次打开我的应用程序 5. 音乐将停止播放,但我的应用程序在应该“播放”时仍显示“暂停”图标

我已经进行了大量的调试和日志记录,以确保在我的应用程序变为活动状态时始终调用更新我的播放/暂停按钮的方法。问题是当我重新进入我的应用程序时,即使音乐停止/暂停,MPMusicPlayer 的播放状态仍设置为 MPMusicPlaybackStatePlaying。

大约一年前,我为此提交了一份错误报告,但没有收到来自 Apple 的任何消息。如果其他人会提交一份,将不胜感激。

于 2012-09-27T13:43:30.373 回答
0

此代码在上一个按钮单击时使用上一首歌将播放

- (IBAction)playPreviousSongInList:(id)sender {

        static NSTimeInterval skipToBeginningOfSongIfElapsedTimeLongerThan = 3.5;

        NSTimeInterval playbackTime = self.musicPlayer.currentPlaybackTime;
        if (playbackTime <= skipToBeginningOfSongIfElapsedTimeLongerThan) {

            [self.musicPlayer skipToPreviousItem];

        } else {

            [self.musicPlayer skipToBeginning];
        }
    }
于 2014-07-14T13:20:53.960 回答
0

我在发布 iOS 5 时遇到了同样的问题。我发现,playbackState 属性确实得到了更新,但是在延迟之后,所以当你的playbackStateDidChanged 方法运行时它还没有设置。

我的解决方法是在我开始播放时设置我自己的名为 musicPlayerRecentlyStartedPlaying 的实例变量。然后我使用一个从计时器调用的方法来检查该变量和playbackState 属性,以确定播放器是否真的在播放:

- (void)playMusic {
    [self.musicPlayer play];
    self.musicPlayerRecentlyStartedPlaying = TRUE;
    self.musicControlsUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateMusicControls:) userInfo:nil repeats:TRUE];
}

- (void)stopMusic {
    [self.musicPlayer stop];
    self.musicPlayerRecentlyStartedPlaying = FALSE;
    [self.musicControlsUpdateTimer invalidate];
}

- (void)updateMusicControls:(NSTimer *)timer {
    BOOL playing = (([self.musicPlayer playbackState] == MPMusicPlaybackStatePlaying)&&(self.musicPlayer.nowPlayingItem));
    if (!playing) {
        // check to see if we recently started playing
        if (self.musicPlayerRecentlyStartedPlaying) {
            playing = TRUE;
        }
    } else {
        // once the property is updated, we no longer need this
        self.musicPlayerRecentlyStartedPlaying = FALSE;
    }
}

您可能不需要从计时器调用 updateMusicControls,但我这样做是因为我还在音乐播放时更新进度条的位置。

于 2012-06-19T18:39:17.800 回答
0

我有同样的问题,但是当我的应用程序在后台运行/暂停多次时,我向 Apple 报告了该错误并希望尽快得到答复,我想知道我的编码是否错误或是否存在 API 问题。如果这是您遇到的错误,这可能会有所帮助。我找到了一个解决方法,即使不是最好的解决方案,因为我的应用程序是可以接受的:

在 viewDidLoad 中,添加以下内容:

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver: self
                       selector: @selector (handle_ApplicationDidBecomeActive:)
                           name: UIApplicationDidBecomeActiveNotification
                         object: nil];

然后,创建一个 handle_ApplicationDidBecomeActive 方法,并添加:

- (void) handle_ApplicationDidBecomeActive: (id) notification
{
    if (musicPlayer.playbackState!=MPMusicPlaybackStatePlaying)
    {
       [playPauseButton setBackgroundImage:[UIImage imageNamed:@"play_iPad.png"] forState:UIControlStateNormal];
       [musicPlayer pause];
    }
    else if(musicPlayer.playbackState==MPMusicPlaybackStatePlaying)
    {
       [playPauseButton setBackgroundImage:[UIImage imageNamed:@"pause_iPad.png"] forState:UIControlStateNormal];
       [musicPlayer pause];
    }
}

(不要将此代码放在您的playbackStateDidChanged 方法中,因为这可能会产生无限循环)

这会将您的按钮和音乐播放器的状态同步到 API 报告的状态。在巧合的情况下,不会有任何类型的影响,在其他情况下,播放器将相应地暂停/播放。

于 2012-04-13T05:50:07.923 回答