如何在MPMoviePlayerController播放失败时获取错误描述
如果video播放失败,我想显示一个UIAlert
。 所以我注册了我的电影播放器的MPMoviePlayerPlaybackDidFinishNotification
:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback 🙂 name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];
在我的myMovieFinishedCallback中:我检查用户信息词典中是否有一个名为error
的对象。 在我的真实设备上,我没有得到这个错误(没有networking错误,文件的404错误)。 在iPhone模拟器上,我收到错误。
当我收到MPMoviePlayerPlaybackDidFinishNotification
时,如何正确地检查推理?
不幸的是, MPMoviePlayerController
(直到但不包括iOS 4.3)没有从文档中可用的问题的详细标识。 如果在MPMovieFinishReasonPlaybackError
的UserInfo中有任何问题,它只会返回MPMoviePlayerPlaybackDidFinishNotification
。
在iOS 4.3中,我们终于得到了包含扩展和非常有用的信息的errorLog
和accessLog
属性。 请参阅MPMoviePlayerController参考 。
使用iOS 5.0时,还会在设备构build中提供error
关键字,而不仅仅是在模拟器中。 该error
是NSError
一个实例,并提供非常有用的信息。 不幸的是,这还没有被苹果公司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
,那么可以假定有些东西出错了。 这种方法相当可靠。