私の状況: AVAudioRecorder でオーディオ ファイルを録音しています。レコードを再生するには、MPMoviePlayerViewController を使用しています。録音、再生、停止等動作しています。
私の問題: 再生後: ホーム ボタンを押して (アプリをバックグラウンドに移動)、もう一度アプリを開くと、アプリがクラッシュします。再生が完了した場合にのみ発生します ([完了] を押すか、最後まで再生させます)。プレイ中にホームボタンを押して再度アプリを開くと、すべて問題ありません。
これがmovieplayerの私のコードです:(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 ではクラッシュしました。
アプリがクラッシュする理由がわかりません。
編集:よくわかりませんが、クラッシュを解決したと思います。
問題はオーディオファイルを再生していないか、それだけではないと思います。録音もこの問題の一部のようです。
AVAudioRecorder で録音するための私のクラスでは、このクラスを AVAudioSession のデリゲートとして登録しました: [[AVAudioSession sharedInstance] setDelegate: self];
これを「ルート」クラス (すべてを開始する「メイン」クラス) に移動し、プロトコル メソッド「beginInterruption」および「endInterruption」を実装すると (NSLog ステートメントでのみ認識されます)、「beginInterruption」が表示されます。アプリをバックグラウンドで設定すると ' が呼び出され、アプリを再度 (フォアグラウンドで) 起動すると 'endInterruption' が呼び出されます。スタックトレースでは、「AudioSessionInterruptionListener」のようなものを見ることができます...デリゲートメソッドの一部のようです。
編集2:
アプリを数回テストしましたが、クラッシュは二度と起こりません。AVAudioSessionDelegate を「ルート」クラスに設定することが答えのようです。