在背景和前景之间切换应用程序后崩溃与MPMoviePlayerViewController

时间:2012-05-15 13:16:35

标签: ios5 mpmovieplayercontroller

我的情况: 我正在使用AVAudioRecorder录制音频文件。 要播放记录我正在使用MPMoviePlayerViewController。 录音,播放,停止等工作正常。

我的问题: 播放后:当我按下主页按钮(将我的应用程序带到后台)并再次打开我的应用程序时,应用程序崩溃。 它仅在播放完成时发生(按“完成”或让它播放到结尾)。当我在播放期间按下主页按钮并再次打开应用程序时,一切都很好。

这是我的电影播放器​​代码:(使用here中的代码)

- (void)playVideo:(NSString*)aVideoUrl {
  MPMoviePlayerViewController *playerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:aVideoUrl]];  

  // Remove the movie player view controller from the "playback did finish" notification observers
  [[NSNotificationCenter defaultCenter] removeObserver:playerVC
                                              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 presentModalViewController:playerVC animated:YES];
  [self presentMoviePlayerViewControllerAnimated:playerVC];

  // Start playback
  [playerVC.moviePlayer prepareToPlay];
  [playerVC.moviePlayer play];
}

- (void)movieFinishedCallback:(NSNotification*)aNotification {
  MPMoviePlayerController *moviePlayer = [aNotification object];

  // Remove this class from the observers
  [[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:MPMoviePlayerPlaybackDidFinishNotification
                                              object:moviePlayer];

  // Dismiss the view controller
  [self dismissModalViewControllerAnimated:YES];
  //[self dismissMoviePlayerViewControllerAnimated];
}

我正在使用iOS5和ARC。

带代码的类是普通的UIViewController,也是该方法的调用者。

仅在设备上发生。模拟器中没有崩溃,但是我的iPhone 4和iPad 1上没有崩溃。

我无法找到我的应用崩溃的原因。

Stacktrace from the crash

修改: 我不太确定知道,但我想我解决了我的崩溃。

我认为问题不在于播放音频故事,或者不仅仅是。录音似乎也是这个问题的一部分。

在我用AVAudioRecorder录制的课程中,我将此课程注册为AVAudioSession的委托:     [[AVAudioSession sharedInstance] setDelegate:self];

我将它移动到我的“root”类(我的“主”类,从我开始所有内容),当我实现协议方法'beginInterruption'和'endInterruption'(只知道NSLog语句)时,我可以看到当我在后台设置应用程序时会调用'beginInterruption',而当我再次启动应用程序时会调用'endInterruption'(前景)。 在堆栈跟踪中,您可以看到类似“AudioSessionInterruptionListener”的内容......似乎是委托方法的一部分。

编辑2

我测试了我的应用程序几次,崩溃再也没有发生过。将AVAudioSessionDelegate设置为我的“root”类似乎就是答案。

1 个答案:

答案 0 :(得分:0)

对我来说,有必要注册AVAudioSession代表:

[[AVAudioSession sharedInstance] setDelegate: self];

我在我的audiorecord处理班的“父级”课程中添加了这个 我还必须实现AVAudioSession委托的beginInterruptionendInterruption

在此之后,崩溃再也没有发生过。