web-dev-qa-db-fra.com

Événement de bouton terminé MPMoviePlayerController

Sur mon iPhone, je lis des fichiers vidéo/audio en mode plein écran. Lorsque le fichier vidéo/audio a atteint sa fin, la méthode suivante est déclenchée:

- (void) movieFinishedCallback:(NSNotification*) aNotification {
    MPMoviePlayerController *player = [aNotification object];

    [player stop];

    [[NSNotificationCenter defaultCenter] 
        removeObserver:self
        name:MPMoviePlayerPlaybackDidFinishNotification
        object:player];

    [player autorelease];
    [moviePlayer.view removeFromSuperview];

    NSLog(@"stopped?");
}

Ça marche bien! Mais le problème est lorsque j'appuie sur le bouton "Terminé" alors que le fichier vidéo/audio est toujours en cours de lecture. Ensuite, cette méthode ne se déclenche pas ...

Quelqu'un a-t-il une idée de comment capturer l'événement lorsque le bouton "Terminé" est enfoncé? Parce qu'en ce moment, le lecteur multimédia reste visible. Ce n'est pas en train de disparaître.

29
w00

Cela a fonctionné pour moi sur iPad lorsque j'écoute MPMoviePlayerWillExitFullscreenNotification.

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(doneButtonClick:) 
                                             name:MPMoviePlayerWillExitFullscreenNotification 
                                           object:nil];

Et méthode sélecteur:

-(void)doneButtonClick:(NSNotification*)aNotification{
    NSNumber *reason = [notification.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];

    if ([reason intValue] == MPMovieFinishReasonUserExited) {
        // Your done button action here
    }
}
44
beryllium

rechercher une énumération dans le dictionnaire userInfo de notification

NSNumber *reason = [notification.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];

if ([reason intValue] == MPMovieFinishReasonUserExited) {

   // done button clicked!

}

La réponse sélectionnée a depuis intégré ma réponse. Veuillez vous référer ci-dessus.

21
dklt

TESTÉ AVEC SUCCÈS DANS iOS7 ET iOS8

Vérifiez et supprimez l'observateur de notification précédent, le cas échéant, pour MPMoviePlayerPlaybackDidFinishNotification.

- (void)playVideo:(NSString*)filePath
{
     // Pass your file path
        NSURL *vedioURL =[NSURL fileURLWithPath:filePath];
        MPMoviePlayerViewController *playerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:vedioURL];

    // Remove the movie player view controller from the "playback did finish" notification observers
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:playerVC.moviePlayer];

    // Register this class as an observer instead
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(movieFinishedCallback:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:playerVC.moviePlayer];

    // Set the modal transition style of your choice
    playerVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

    // Present the movie player view controller
    [self presentViewController:playerVC animated:YES completion:nil];

    // Start playback
    [playerVC.moviePlayer prepareToPlay];
    [playerVC.moviePlayer play];
}

Ignorer le contrôleur

- (void)movieFinishedCallback:(NSNotification*)aNotification
{
    // Obtain the reason why the movie playback finished
    NSNumber *finishReason = [[aNotification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];

    // Dismiss the view controller ONLY when the reason is not "playback ended"
    if ([finishReason intValue] != MPMovieFinishReasonPlaybackEnded)
    {
        MPMoviePlayerController *moviePlayer = [aNotification object];

        // Remove this class from the observers
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:MPMoviePlayerPlaybackDidFinishNotification
                                                      object:moviePlayer];

        // Dismiss the view controller
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

Vous avez terminé !!!

17
Kampai

Version Swift, pour toute personne intéressée:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "moviePlayerDoneButtonClicked:", name: MPMoviePlayerPlaybackDidFinishNotification, object: nil)

Gestionnaire de notifications:

func moviePlayerDoneButtonClicked(note: NSNotification) {

    let reason = note.userInfo?[MPMoviePlayerPlaybackDidFinishReasonUserInfoKey]
    if (MPMovieFinishReason(rawValue: reason as! Int) == MPMovieFinishReason.UserExited) {
        self.exitVideo()
    }
}
2
Lirik
@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(doneButtonClick:) 
                                             name:MPMoviePlayerDidExitFullscreenNotification 
                                           object:nil];

- (void)doneButtonClick:(NSNotification*)aNotification
{
    if (self.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
    {
        NSLog(@"done button tapped");
    }
    else
    {
        NSLog(@"minimize tapped");
    }
}
2
iCoder

Wow, tant de mauvaises approches. La réponse est aussi simple:

    moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:filePath]];

    [self.navigationController presentMoviePlayerViewControllerAnimated:moviePlayerViewController];

Vérifiez ce lien si vous avez une minute: https://developer.Apple.com/library/prerelease/ios/documentation/MediaPlayer/Reference/UIViewController_MediaPlayer_Additions/index.html

Bon codage! Z.

1
Zoltán

La documentation d'Apple est très pauvre à ce sujet. Il suggère d'écouter MPMoviePlayerDidExitFullscreenNotification (ou WillExit ...) et NON pour MPMoviePlayerDidFinishNotification car il ne se déclenche pas lorsque l'utilisateur appuie sur Terminé. Ce n'est absolument pas vrai! Je viens de le tester sur Xcode 6.0 avec iPad Simulator (iOS 7.1 + 8.0) et seul MPMoviePlayerDidFinishNotification est déclenché lorsque DONE est appuyé.

Mes compliments à user523234 qui a bien compris l'un des commentaires ci-dessus.

Inscrire l'observateur suivant

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playbackStateChanged:)
                                        name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:_mpc];
0
nstein