如何在MPMoviePlayerController播放失败时获取错误描述

如果video播放失败,我想显示一个UIAlert 。 所以我注册了我的电影播放器​​的MPMoviePlayerPlaybackDidFinishNotification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback 🙂 name:MPMoviePlayerPlaybackDidFinishNotification object:self.movi​​ePlayer];

在我的myMovieFinishedCallback中:我检查用户信息词典中是否有一个名为error的对象。 在我的真实设备上,我没有得到这个错误(没有networking错误,文件的404错误)。 在iPhone模拟器上,我收到错误。

当我收到MPMoviePlayerPlaybackDidFinishNotification时,如何正确地检查推理?

不幸的是, MPMoviePlayerController (直到但不包括iOS 4.3)没有从文档中可用的问题的详细标识。 如果在MPMovieFinishReasonPlaybackError的UserInfo中有任何问题,它只会返回MPMoviePlayerPlaybackDidFinishNotification

在iOS 4.3中,我们终于得到了包含扩展和非常有用的信息的errorLogaccessLog属性。 请参阅MPMoviePlayerController参考 。

使用iOS 5.0时,还会在设备构build中提供error关键字,而不仅仅是在模拟器中。 该errorNSError一个实例,并提供非常有用的信息。 不幸的是,这还没有被苹果公司logging下来,因此它可能在任何iOS版本上都有所改变。 此外,似乎没有解释给出的错误代码。 例如,HTTP-Status:404会在给定的错误实例中产生错误代码-1100 。 但是,这将是一个如何以最合适的方式处理这个通知的例子。

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMPMoviePlayerPlaybackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

这将是一个正确的通知处理程序:

 - (void)handleMPMoviePlayerPlaybackDidFinish:(NSNotification *)notification { NSDictionary *notificationUserInfo = [notification userInfo]; NSNumber *resultValue = [notificationUserInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey]; MPMovieFinishReason reason = [resultValue intValue]; if (reason == MPMovieFinishReasonPlaybackError) { NSError *mediaPlayerError = [notificationUserInfo objectForKey:@"error"]; if (mediaPlayerError) { NSLog(@"playback failed with error description: %@", [mediaPlayerError localizedDescription]); } else { NSLog(@"playback failed without any given reason"); } } } 

最后但并非最不重要的是,当释放正在处理的对象的实例时,不要忘记从默认中心删除通知处理程序。

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

我有同样的问题。 虽然我注册了MPMoviePlayerLoadStateDidChangeNotificationcallback函数,并从userInfovariables获取错误,但没有显示错误。 我花了很多时间在论坛上search,玩过代码后,我意识到问题所在。

首先你需要注册callback函数:

  // Register that the did finish notification (movie stopped) [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer]; 

在MovieFinishedcallback函数中,您将需要:

 NSDictionary *notice = [paramNotification userInfo]; if (notice != nil) { NSError *errorInfo = [notice objectForKey:@"error"]; if ( errorInfo != nil ) { UIAlertView *notice = [[UIAlertView alloc] initWithTitle:@"Error" message:[errorInfo localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [notice show]; [notice release]; } } 

此代码将显示与电影控制器相关的任何错误。 所以..我的代码中有什么问题?我在错误的地方使用了[moviecontroller play]方法,所以请检查你的方法。

祝你好运!

您可以查看userinfo字典的MPMoviePlayerPlaybackDidFinishReasonUserInfoKey后面的值。 如果值是MPMovieFinishReasonPlaybackError ,那么可以假定有些东西出错了。 这种方法相当可靠。