MPMoviePlayerPlaybackDidFinishNotification 在不应该被调用时被调用
Posted
技术标签:
【中文标题】MPMoviePlayerPlaybackDidFinishNotification 在不应该被调用时被调用【英文标题】:MPMoviePlayerPlaybackDidFinishNotification gets called when it shouldn't 【发布时间】:2010-11-11 19:29:51 【问题描述】:根据 Apple 的 MPMoviePlayerController 文档:
MPMoviePlayerPlaybackDidFinishNotification - 如果电影播放器以全屏模式显示并且用户点击完成按钮,则不会发送此通知。
在我看来这是完全错误的。使用下面的代码,当我点击完成按钮时会调用 playerPlaybackDidFinish。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerPlaybackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.player];
- (void) playerPlaybackDidFinish:(NSNotification*)notification
NSLog(@"WHY?");
self.player.fullscreen = NO;
我需要区分用户点击完成按钮和电影在整个播放过程中完成。 playerPlaybackDidFinish 确实会在电影结束时被调用,但就像我说的那样,当你点击完成时它也会被调用。
【问题讨论】:
你不能在完成按钮上捕获事件吗? 我不这么认为。它是 MPMoviePlayer 的一部分,没有回调。 我也有同样的情况,请帮忙! 【参考方案1】:这是您检查 MPMoviePlayerPlaybackDidFinishReasonUserInfoKey 的方法,它是 MPMoviePlayerPlaybackDidFinishNotification 通知的一部分
- (void) playbackDidFinish:(NSNotification*)notification
int reason = [[[notification userInfo] valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];
if (reason == MPMovieFinishReasonPlaybackEnded)
//movie finished playin
else if (reason == MPMovieFinishReasonUserExited)
//user hit the done button
else if (reason == MPMovieFinishReasonPlaybackError)
//error
【讨论】:
【参考方案2】:当电影一直播放到最后时,我正在使用以下内容:
- (void)playbackDidFinish:(NSNotification*)notification
BOOL playbackEnded = ([[[notification userInfo] valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue] == MPMovieFinishReasonPlaybackEnded);
BOOL endReached = (self.player.currentPlaybackTime == self.player.playableDuration);
if (playbackEnded && endReached)
// Movie Ended
【讨论】:
【参考方案3】:当您收到通知时,您可以检查播放器的 endPlaybackTime。如果它是 -1,那么电影就自然而然地结束了。
对于流式内容,您可以检查 MPMoviePlayerPlaybackDidFinishNotification 上 userInfo 内的 MPMoviePlayerPlaybackDidFinishReasonUserInfoKey。
如果等于 MPMovieFinishReasonUserExited 则表示用户停止播放内容。
【讨论】:
刚刚尝试过。 self.player.endPlaybackTime 是 -1,无论您是通过“完成”按钮关闭还是一直播放。检查文档 - “此属性不适用于流式内容。” 哦,我不知道你在谈论流媒体内容......我已经修改了我的答案 这似乎是个好主意,但如果 ([[[notification userInfo] objectForKey:@"MPMoviePlayerPlaybackDidFinishReasonUserInfoKey"] intValue] == MPMovieFinishReasonUserExited) 总是返回 false,无论我单击完成还是用户结束自然。【参考方案4】:确保
moviePlayer.repeatMode = MPMovieRepeatModeNone;
【讨论】:
以上是关于MPMoviePlayerPlaybackDidFinishNotification 在不应该被调用时被调用的主要内容,如果未能解决你的问题,请参考以下文章