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.
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
}
}
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.
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é !!!
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()
}
}
@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");
}
}
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.
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];