Obtenir un mauvais état de lecture dans MP Music Player Controller dans ios 5

Je me trompe d'état de lecture dans le lecteur de musique MP. en jouant une chanson je suis en état de pause. Mon application fonctionne très bien dans ios 4. mais j'ai ce problème dans ios 5. quelqu'un peut-il m'aider ??

Mon code est ici.

[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]; } 

J'ai également signalé ce bug à Apple. J'ai été capable de le reproduire à 100% en faisant ce qui suit:

Lancez l'application qui utilise MPMusicPlayerController. Lancez l'application "Music". Hit Play, Ignorer, Ignorer, Pause, Lecture, Pause Ouvrir l'application d'origine et MPMusicPlaybackState de MPMusicPlayerController sera incorrect.

Aucune des solutions proposées ici n'a fonctionné pour moi. La solution qui a fonctionné était de garder une trace de quand le bogue se produisait et de mettre à jour l'interface user spécialement dans ces cas.

Lorsque la notification UIApplicationDidBecomeActiveNotification est reçue (voir la publication de matbur pour plus de détails à ce sujet), vérifiez si l'audio n'est pas en cours de lecture lorsque MPMusicPlaybackState a déclaré:

 -(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; } 

N'oubliez pas d'importer le framework AudioToolbox.

Aucune de ces solutions de contournement résoudre le problème pour mon application. C'est un bug dans iOS, et mon application ne fonctionnera jamais correctement tant qu'Apple ne l'aura pas corrigé.

J'ai un lecteur de musique avec un button lecture / pause. Lorsque la musique est en cours de lecture, le button affiche l'icône "pause". Lorsque la musique est en pause, le button affiche l'icône "lecture", comme toutes les applications musicales. Je peux reproduire le bug à tout moment en faisant ce qui suit: 1. Jouer de la musique dans mon application (le button lecture / pause montre l'icône "pause" correctement) 2. Context mon application et verrouiller mon téléphone pendant ~ 10 minutes 3. Double Appuyez sur Accueil et appuyez sur le button Pause depuis les commands de l'iPod 4. Déverrouillez mon téléphone et ouvrez à nouveau mon application 5. La musique sera arrêtée, mais mon application affiche toujours l'icône "Pause" alors qu'elle devrait "jouer"

J'ai fait beaucoup de debugging et de journalisation pour m'assurer que la méthode qui met à jour mon button de lecture / pause est toujours appelée quand mon application devient active. Le problème est que lorsque je ré-entrer dans mon application, l'état de lecture de MPMusicPlayer est toujours réglé sur MPMusicPlaybackStatePlaying même lorsque la musique est arrêtée / en pause.

J'ai déposé un rapport de bug pour cela il y a environ un an et je n'ai rien entendu d'Apple. Si quelqu'un d'autre en déposait un, ce serait grandement apprécié.

J'ai le même problème mais quand je joue / pause plusieurs fois quand mon application est en arrière-plan, j'ai signalé le bug à Apple et j'espère get une réponse bientôt, je veux savoir si mon encoding est faux ou s'il y a un problème d'API. Si c'était l'erreur que vous aviez, cela pourrait être utile. Je suis venu à une solution de contournement qui, même si ce n'est pas la meilleure solution, pour mon application est acceptable:

Dans viewDidLoad, ajoutez ceci:

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

Ensuite, créez une méthode handle_ApplicationDidBecomeActive et ajoutez ceci:

 - (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]; } } 

(Ne mettez pas ce code dans votre méthode playbackStateDidChanged car cela pourrait générer une boucle sans fin)

Cela va synchroniser l'état de vos buttons et lecteur de musique à celui signalé par l'API. dans les cas où il y a une coïncidence, il n'y aura aucun impact de quelque sorte que ce soit, dans les autres cas, le joueur s'arrêtera / jouera en conséquence.

J'ai rencontré le même problème avec la version d'iOS 5. J'ai découvert que la propriété playbackState est mise à jour, mais après un timeout, elle n'est pas encore définie lorsque la méthode playbackStateDidChanged est exécutée.

Ma solution de contournement consistait à définir ma propre variable d'instance appelée musicPlayerRecentlyStartedPlaying chaque fois que je lance la lecture. Ensuite, j'utilise une méthode appelée à partir d'une timer pour vérifier à la fois cette variable et la propriété playbackState pour savoir si le joueur joue réellement:

 - (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; } } 

Vous n'avez peut-être pas besoin d'appeler updateMusicControls à partir d'une timer, mais je le fais parce que je suis également en train de mettre à jour la position d'une barre de progression pendant que la musique joue.

Ce code à l'aide du button précédent click La chanson précédente sera jouée

 - (IBAction)playPreviousSongInList:(id)sender { static NSTimeInterval skipToBeginningOfSongIfElapsedTimeLongerThan = 3.5; NSTimeInterval playbackTime = self.musicPlayer.currentPlaybackTime; if (playbackTime <= skipToBeginningOfSongIfElapsedTimeLongerThan) { [self.musicPlayer skipToPreviousItem]; } else { [self.musicPlayer skipToBeginning]; } }