Here in my code playerPlayBackDidFinish is not called upon clicking the nextbutton and backButton on TopBar. but it is called when the video file is played completly, please help if anybody know...
My code is as follows.
#import "seq_nineViewController.h"
@implementation seq_nineViewController
@synthesize ninethVideoController, Bean;
@synthesize localBackFlag;
@synthesize goingNextButton, goingBackButton;
- (void) viewWillAppear:(BOOL)animated {
//[super viewWillAppear];
appDelegate = (wishstix_appAppDelegate *) [[UIApplication sharedApplication] delegate];
appDelegate.backFlag = 0;
self.localBackFlag = 0;
self.navigationController.navigationBarHidden = NO;
self.navigationItem.hidesBackButton = YES;
goingNextButton =[[UIBarButtonItem alloc] init];
goingNextButton.title=@"Next";
goingNextButton.target=self;
goingNextButton.action=@selector(nextAction);
self.navigationItem.rightBarButtonItem=goingNextButton;
[goingNextButton release];
goingBackButton =[[UIBarButtonItem alloc] init];
goingBackButton.title=@"Back";
goingBackButton.target=self;
goingBackButton.action=@selector(backAction);
self.navigationItem.leftBarButtonItem=goingBackButton;
[goingBackButton release];
NSEnumerator *AplicationEnumerator = [[appDelegate.categoryDictionary objectForKey:[appDelegate.categoryArray objectAtIndex:appDelegate.categoryRowId]] reverseObjectEnumerator];
NSArray *array = [AplicationEnumerator allObjects];
NSArray *arr = [[NSArray alloc] initWithArray:array];
self.Bean = [arr objectAtIndex:appDelegate.appLicationRowId];
MediaVideoPostUIBean *seq9_asset = [[[self.Bean aplicationFlow] arrayOfMediaVideoPostUI]objectAtIndex:2];
if ([[seq9_asset skip] isEqualToString:skipValueFalse]) {
NSMutableString *url = [[NSMutableString alloc] init];
[url appendString:[appDelegate.rootBean RootFileLocation]];
if (appDelegate.avatarFlag == 1)
[url appendString:[seq9_asset srcUrlMale]];
else if (appDelegate.avatarFlag == 2)
[url appendString:[seq9_asset srcUrlFemale]];
[appDelegate showActivityViewer];
self.ninethVideoController = [self getVideo:url];
if (self.ninethVideoController == nil) {
appDelegate.viewNumber = 15;
ControllerClass *temp = [[ControllerClass alloc] init];
[temp changeViewControllers];
} else {
self.goingNextButton.enabled = NO;
self.goingBackButton.enabled = NO;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ninthMoviePlayerPlaybackDidFinish) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; // self.ninethVideoController];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ninthPlayerLoadState) name:MPMoviePlayerLoadStateDidChangeNotification object:self.ninethVideoController];
[self.view addSubview:self.ninethVideoController.view];
[self.ninethVideoController play];
[url release];
}
}
else if ([[seq9_asset skip] isEqualToString:skipValueTrue]) {
appDelegate.viewNumber = 15;
ControllerClass *temp = [[ControllerClass alloc] init];
[temp changeViewControllers];
}
}
- (MPMoviePlayerController*)getVideo:(NSString *)url {
NSLog(@"Inside the getVideo of ninthMoviePlayer");
[url retain];
NSURL *fileURL = [NSURL URLWithString:url];
MPMoviePlayerController *moviePlayerController = [[[MPMoviePlayerController alloc] initWithContentURL:fileURL] autorelease];
if (([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeRight) || ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationLandscapeLeft))
moviePlayerController.view.frame = CGRectMake(0.0, 0.0, 480.0, 280.0);
else
moviePlayerController.view.frame = CGRectMake(0.0, -35.0, 320.0, 436.0);
[url release];
return moviePlayerController;
}
- (void) ninthMoviePlayerPlaybackDidFinish {
NSLog(@"Inside the ninthPlayerPlaybackDidFinish");
[self.ninethVideoController.view removeFromSuperview];
self.ninethVideoController = nil;
if (self.localBackFlag == 1) {
[self.navigationController popViewControllerAnimated:YES];
} else {
appDelegate.viewNumber = 15;
ControllerClass *control = [[ControllerClass alloc] init];
[control changeViewControllers];
}
}
- (void) ninthPlayerLoadState{
[appDelegate hideActivityViewer];
self.goingNextButton.enabled = YES;
self.goingBackButton.enabled = YES;
}
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
if ((interfaceOrientation == UIInterfaceOrientationLandscapeRight) || (interfaceOrientation == UIInterfaceOrientationLandscapeLeft)) {
NSLog(@"enterd landscape");
[self.ninethVideoController.view removeFromSuperview];
self.ninethVideoController.view.frame = CGRectMake(0.0, 0.0, 480.0, 280.0);
[self.view addSubview:self.ninethVideoController.view];
} else if (interfaceOrientation == UIInterfaceOrientationPortrait) {
NSLog(@"entered portrait");
[self.ninethVideoController.view removeFromSuperview];
self.ninethVideoController.view.frame = CGRectMake(0.0, -35.0, 320.0, 436.0);
[self.view addSubview:self.ninethVideoController.view];
} else if (interfaceOrientation == UIDeviceOrientationPortraitUpsideDown) {
NSLog(@"entered PortraitUpsideDown");
[self.ninethVideoController.view removeFromSuperview];
self.ninethVideoController.view.frame = CGRectMake(0.0, -20.0, 320.0, 436.0);
[self.view addSubview:self.ninethVideoController.view];
}
return (YES);
}
- (IBAction) nextAction {
NSLog(@"Inside the nextAction of ninthVideoPlayer");
appDelegate.backFlag = 0;
self.localBackFlag = 0;
[self.ninethVideoController stop];
NSLog(@"After executing stop statememt");
//[self ninthPlayerPlaybackDidFinish];
}
- (IBAction) backAction {
NSLog(@"Inside 开发者_C百科the backAction of ninthVideoPlayer");
appDelegate.backFlag = 1;
self.localBackFlag = 1;
//[self.ninethVideoController pause];
[self.ninethVideoController stop];
//[self ninthPlayerPlaybackDidFinish];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
self.ninethVideoController = nil;
}
@end
Did u read this
MPMoviePlayerPlaybackDidFinishNotification
Notifies observers that the movie finished playing. The affected movie player is stored in the object parameter of the notification. The userInfo dictionary of this notification contains the MPMoviePlayerPlaybackDidFinishReasonUserInfoKey key, which indicates the reason that playback finished. This notification is also sent when playback fails because of an error.
This notification is not sent in cases where the movie player is displaying in fullscreen mode and the user taps the Done button. In that instance, the Done button causes movie playback to pause while the player transitions out of fullscreen mode. If you want to detect this scenario in your code, you should monitor other notifications such as MPMoviePlayerDidExitFullscreenNotification.
Make sure that you are not doing anything that does not sent this notification
observe
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieDidExitFullscreen:)
name:MPMoviePlayerDidExitFullscreenNotification
object:nil];
and add action
- (IBAction) movieDidExitFullscreen:(NSNotification*)notification
{
NSLog(@"movieDidExitFullscreen");
[self.moviePlayer stop];
[self.moviePlayer setFullscreen:NO animated:NO];
[self.moviePlayer.view removeFromSuperview];
}
I had similar issue and found out that setting repeatMode of MPMoviePlayerController to MPMovieRepeatModeOne stops MPMoviePlayerPlaybackDidFinishNotification from firing which i had to do for playing video in loop.
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:video_url];
[moviePlayer setRepeatMode:MPMovieRepeatModeOne];
When i changed repeatMode to MPMovieRepeatModeNone, MPMoviePlayerPlaybackDidFinishNotification was fired properly.
精彩评论