在ios 5中的MP音乐播放器控制器中出现错误的播放状态

时间:2012-04-12 06:47:20

标签: iphone objective-c ios ios5 ios4

我在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];
 }

5 个答案:

答案 0 :(得分: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框架。

答案 1 :(得分:3)

这些解决方法都没有解决我的应用的问题。这是iOS中的一个错误,我的应用程序将无法正常运行,直到Apple修复它。

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

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

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

答案 2 :(得分: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报告的状态。在有巧合的情况下,不会有任何类型的影响,在其他情况下,玩家将相应地暂停/玩耍。

答案 3 :(得分: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,但我这样做是因为我还在播放音乐时更新进度条的位置。

答案 4 :(得分: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];
        }
    }