Неправильное состояние воспроизведения в MP Music Player Controller в ios 5

Я получаю неправильное состояние воспроизведения в музыкальном проигрывателе 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 ответов

Я также сообщил об этой ошибке в Apple. Я смог воспроизвести его 100% времени, выполнив следующие действия:

Запустите приложение, которое использует MPMusicPlayerController. Запустите приложение "Музыка". Нажмите "Воспроизвести", "Пропустить", "Пропустить", "Приостановить", "Воспроизвести", "Приостановить". Откройте исходное приложение, и MPMusicPlaybackState в MPMusicPlayerController будет неправильным.

Ни одно из предложенных здесь решений не помогло мне. Решение, которое действительно работало, состояло в том, чтобы отслеживать, когда произошла ошибка, и обновлять пользовательский интерфейс, особенно в этих случаях.

Когда 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.

Ни один из этих обходных путей не устранил проблему для моего приложения. Это ошибка в iOS, и мое приложение никогда не будет работать должным образом, пока Apple не исправит это.

У меня есть музыкальный проигрыватель с кнопкой воспроизведения / паузы. Когда играет музыка, на кнопке отображается значок "пауза". Когда музыка находится в режиме паузы, на кнопке отображается значок "Воспроизведение" - как и во всех музыкальных приложениях. Я могу повторить ошибку в любое время, выполнив следующие действия: 1. Воспроизведите музыку в моем приложении (кнопка "Воспроизвести / Пауза" правильно отображает значок "Пауза") 2. Отключить фоновое изображение моего приложения и заблокировать телефон на ~10 минут 3. Удвоить нажмите "Домой" и нажмите кнопку "Пауза" на панели управления iPod. 4. Разблокируйте мой телефон и снова откройте мое приложение. 5. Музыка будет остановлена, но мое приложение по-прежнему отображает значок "Пауза", когда оно должно "воспроизвести".

Я провел обширную отладку и ведение журнала, чтобы гарантировать, что метод, который обновляет мою кнопку воспроизведения / паузы, всегда вызывается, когда мое приложение становится активным. Проблема заключается в том, что при повторном входе в мое приложение состояние воспроизведения MPMusicPlayer все еще устанавливается на MPMusicPlaybackStatePlaying, даже когда музыка остановлена ​​/ приостановлена.

Я подал отчет об ошибке для этого около года назад и ничего не слышал от Apple. Если кто-то еще подаст один, это будет очень цениться.

У меня та же проблема, но когда я играю / приостанавливаю много раз, когда мое приложение работает в фоновом режиме, я сообщаю об ошибке в 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];
    }
}

(не помещайте этот код в ваш метод PlayStateDidChanged, так как это может создать бесконечный цикл)

Это синхронизирует состояние ваших кнопок и музыкального проигрывателя с тем, о котором сообщает API. в случаях, когда есть совпадение, никакого воздействия не будет, в других случаях игрок будет соответственно приостанавливать / играть.

Этот код используется при нажатии предыдущей кнопки Предыдущая песня будет воспроизведена

- (IBAction)playPreviousSongInList:(id)sender {

        static NSTimeInterval skipToBeginningOfSongIfElapsedTimeLongerThan = 3.5;

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

            [self.musicPlayer skipToPreviousItem];

        } else {

            [self.musicPlayer skipToBeginning];
        }
    }

У меня возникла та же проблема с выпуском iOS 5. Я обнаружил, что свойство PlayState обновляется, но с некоторой задержкой, поэтому оно еще не установлено, когда запускается ваш воспроизведение StateDidChanged.

Мой обходной путь должен был установить мою собственную переменную экземпляра с названием musicPlayerRecentlyStartedPlaying всякий раз, когда я начинаю воспроизведение. Затем я использую метод, вызванный из таймера, чтобы проверить и эту переменную, и свойство PlayState, чтобы выяснить, действительно ли проигрыватель играет:

- (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 из таймера, но я это делаю, потому что я также обновляю положение индикатора выполнения по мере воспроизведения музыки.

Другие вопросы по тегам