2012-04-12 5 views
7

Ich bekomme einen falschen Wiedergabe-Status im MP-Musik-Player. Beim Abspielen eines Songs bekomme ich einen Pause-Status. Meine App funktioniert gut in IOS 4. Aber ich habe dieses Problem in IOS 5. kann mir jemand helfen?Falscher Wiedergabe-Status im MP Music Player-Controller in iOS 5

Mein Code ist hier.

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

können Sie einige Stück Code hier zeigen spielen wird, klicken ..? – Kamarshad

+0

@Kamarshad Frage mit Code bearbeitet. –

+0

@VivekParikh - Bitte überprüfen Sie die folgende Frage. http://stackoverflow.com/questions/8854923/did-mpmusicplayercontroller-change-with-ios-5 – itsaboutcode

Antwort

0

Ich habe das gleiche Problem, aber wenn ich viele Male Play/Pause, wenn meine app im Hintergrund ist, berichtete ich den Fehler zu Apple und hoffen, bald eine amswer zu bekommen, ich möchte wissen, ob meine Codierung falsch ist oder es gibt ein API-Problem. Wenn dies der Fehler war, den Sie hatten, kann dies hilfreich sein. Ich kam zu einer Vermeidung des Problems, die, obwohl ist nicht die beste Lösung, für meine Anwendung akzeptabel ist:

Im viewDidLoad, fügen Sie diese:

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

Erstellen Sie dann eine handle_ApplicationDidBecomeActive Methode, und fügen Sie diese:

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

(nicht diesen Code in Ihrer playbackStateDidChanged Methode setzen, da dies eine Endlosschleife erzeugen kann)

Dies wird den Zustand des yo synchronisieren Ihre Tasten und Musik-Player zu dem von der API gemeldet. in den Fällen, in denen es einen Zufall gibt, wird es keinen Einfluss irgendeiner Art geben, in den anderen Fällen wird der Spieler entsprechend pausieren/spielen.

0

Ich hatte das gleiche Problem mit der Veröffentlichung von iOS 5. Ich fand, dass die PlaybackState -Eigenschaft aktualisiert wird, aber nach einer Verzögerung, so ist es noch nicht festgelegt, wenn Ihre PlaybackStateDidChanged-Methode ausgeführt wird.

Meine Problemumgehung war, meine eigene Instanzvariable mit dem Namen musicPlayerRecentlyStartedPlaying zu setzen, wenn ich die Wiedergabe starte. Dann benutze ich eine Methode aus einem Timer aufgerufen sowohl die Variable und die playbackState Eigenschaft zu überprüfen, um herauszufinden, ob der Spieler wirklich spielt:

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

Sie werden vielleicht nicht updateMusicControls von einem Timer aufrufen müssen, aber ich tun, weil Ich aktualisiere auch die Position eines Fortschrittsbalkens, während die Musik spielt.

+0

Unabhängig davon, wie lange ich darauf warte Überprüfen Sie den Wiedergabe-Status, es ist falsch, bis ich die Wiedergabe anhalten/neu starten, während meine App aktiv ist. –

+0

Mein Code geht davon aus, dass Sie Musik nur innerhalb der App abspielen und pausieren. Ich denke nicht, dass die ursprüngliche Frage Hintergrundbetrieb erwähnt, obwohl die anderen Antworten sich auf dieses Szenario beziehen. – arlomedia

+0

Das Szenario, das mir am meisten Kopfschmerzen bereitet, ist jemand, der die App verlässt, um das Lied zu ändern. Obwohl der neue Titel gerade abgespielt wird, wird der Status der Benachrichtigung und der Wiedergabe an die App als Pause angezeigt. –

3

Keine dieser Problemumgehungen beheben das Problem für meine App. Es ist ein Fehler in iOS, und meine App wird nie richtig funktionieren, bis Apple es behebt.

Ich habe einen Musik-Player mit einem Play/Pause-Taste. Wenn Musik gespielt wird, zeigt die Taste das "Pause" -Symbol an. Wenn die Musik angehalten ist, wird auf der Schaltfläche das Symbol "Wiedergabe" angezeigt - genau wie bei allen Musik-Apps. Ich kann den Fehler jederzeit wiederholen, indem Sie Folgendes tun: 1. Musik in meiner App (die Wiedergabe/Pause-Taste zeigt das Symbol "Pause" richtig) 2. Hintergrund meiner App und sperren Sie mein Handy für ~ 10 Minuten 3. Doppel tippe nach Hause und drücke die Pause-Taste von der iPod-Steuerung 4. Entsperren Sie mein Telefon und öffnen Sie meine App erneut 5. Musik wird gestoppt, aber meine App zeigt immer noch das "Pause" -Symbol, wenn es so "spielen" sollte

Ich habe umfangreiche Debugging und Protokollierung durchgeführt, um sicherzustellen, dass die Methode, die meine Wiedergabe/Pause-Schaltfläche aktualisiert, immer aufgerufen wird, wenn meine Anwendung aktiv wird. Das Problem ist, dass der Wiedergabestatus von MPMusicPlayer immer noch auf MPMusicPlaybackStatePlaying eingestellt ist, wenn ich meine App erneut eingebe, auch wenn Musik gestoppt/pausiert wird.

Ich habe vor etwa einem Jahr einen Fehlerbericht eingereicht und nichts von Apple gehört. Wenn jemand anderes einen einreichen würde, wäre das sehr zu schätzen.

4

Ich habe diesen Fehler auch an Apple gemeldet. Ich konnte es zu 100% der Zeit reproduzieren, indem ich Folgendes tue:

Starten Sie eine Anwendung, die MPMusicPlayerController verwendet. Starten Sie die App "Musik". Hit Play, Überspringen, Überspringen, Anhalten, Wiedergabe, Pause Öffnen Sie die ursprüngliche Anwendung und der MPMusicPlaybackState von MPMusicPlayerController wird falsch sein.

Keine der hier vorgeschlagenen Lösungen funktionierte für mich. Die Lösung, die funktionierte, bestand darin, zu verfolgen, wann der Fehler aufgetreten ist, und die Benutzeroberfläche speziell in diesen Fällen zu aktualisieren.

Wenn die UIApplicationDidBecomeActiveNotification Benachrichtigung empfangen wird (matbur Post für weitere Details zu diesem Thema sehen), ob Audio-Wiedergabe eigentlich nicht, wenn die MPMusicPlaybackState sagte, es wäre:

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

Sie nicht die AudioToolbox zu importieren vergessen Rahmen.

+0

Und was soll ich mit diesen Informationen machen? Wie kann ich den richtigen Status erhalten? Oder wie kann ich den Player zurücksetzen? – MetaImi

+0

Ich habe es. Wenn audioIsPlaying wahr ist, können Sie die Musikplayer-Pause-Methode verwenden, um die Musik anzuhalten, auch wenn sie einen falschen Status hat. Und umgekehrt. Mit diesem Code-Snippet können Sie den mpmusicplayercontroller reparieren – MetaImi

0

Dieser Code zu verwenden, wenn Sie später Vorheriges Lied

- (IBAction)playPreviousSongInList:(id)sender { 

     static NSTimeInterval skipToBeginningOfSongIfElapsedTimeLongerThan = 3.5; 

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

      [self.musicPlayer skipToPreviousItem]; 

     } else { 

      [self.musicPlayer skipToBeginning]; 
     } 
    } 
Verwandte Themen