2009-07-29 14 views
2

私は長いムービーをアプリに入れているので、ユーザーが中断したポイントに戻すための最良の方法を知りたかったのです。誰かが私を正しい方向に向けることができますか?MPMoviePlayerインスタンス内でユーザーの現在の場所を特定するにはどうすればよいですか?

もしあなたが映画を見ているなら、現在の時間の通知か、その時間にインスタンスを再度保存して読み込むことができるのでしょうか?

ありがとうございます!

答えて

5

プライベートAPIコンポーネントを使用しないOS 3.0の技術が見つかりました。

MPAVControllerTimeDidJumpNotification通知を受信し、その通知のuserInfoディクショナリからMPAVControllerTimeParameter NSNumberを取得するように登録できます。

たとえば、あなたが再生レジスタを開始する直前に通知を受信する:

#define MPAVControllerTimeDidJumpNotification @"MPAVControllerTimeDidJumpNotification" 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTimeChanged:) name:MPAVControllerTimeDidJumpNotification object:nil]; 

はその後、映画の再生を開始します。ムービーの再生時に、各時間変更のために呼び出されるメソッドの追加:

-(void)handleTimeChanged:(NSNotification *)notification 
{ 
    NSDictionary * userInfo = notification.userInfo; 
    int lastPositionInSeconds = [[userInfo valueForKey:@"MPAVControllerTimeParameter"] intValue]; 
    NSLog(@"Last time was %d", lastPositionInSeconds); 
} 

を、ムービーが再生を停止したとき(あなたはMPMoviePlayerPlaybackDidFinishNotification通知を聞くことによってこれを知っている)MPAVControllerTimeDidJumpNotification通知を聞いて停止します。私は実際にすべてのイベントのために見

+0

ジェイソン、これは素晴らしいです。非常に役に立ちます。 –

+0

これで、最後にSQLデータベースにlastPositionInSecondsを格納できました。ユーザーがビデオに戻ると、次のように設定できます。 moviePlayerController.initialPlaybackTime = lastPositionInSeconds; それはうまくいくはずです。再度、感謝します! –

2

この質問の重複や、ここで以下の他の質問に関連している:これらの質問から回答を繰り返しに

、電流はありません特定のフレームまたは特定の時点で映画を開始するための公開API。利用可能なプライベートAPI(-currentTimeおよび-setCurrentTime)がありますが、それらは変更される可能性があり、承認プロセス中に却下されます。

+0

「あなたのアプリが拒否される」と言うのは不公平だと思います。コードを慎重に記述すると、安全な方法でこれらの機能を活用することができ、適切なフォールバックがある(または少なくともクラッシュしない)場合、アプリは拒否されません。店内には、APIを灰色で使用するアプリがたくさんあります。 –

+0

アプリレビュープロセス中、AppleはプライベートAPIの使用をチェックします。プライベートAPIを使用しているとわかった場合、あなたのアプリは拒否されます。確かにプライベートAPIを利用してレビュークラックを通るアプリはありますが、プライベートAPIを利用することは推奨されません。特に、将来のOSアップデートで変更され、アプリが壊れる可能性がある場合にはおすすめしません。 プライベートAPIの使用を推奨するために、StackOverflowに関する提案された回答には有益ではありません。 – shek

+0

お世話になりました。それは感謝しています。 –

0

スラヴァは、動画再生中にシステムによって解雇と役立つかもしれない何か他のものを見ていません。そのMPAVControllerTimeDidJumpNotificationは、再生中に定期的に起動されますが、例えば1秒ごとに起動されることはありません。各キーフレームで解雇されるかもしれませんが、私はそれについては分かりません。

+0

ジェイソン、私がこれを試していたとき、ユーザーが完了ボタンを押すと、ビデオの途中であると言いました。 2009-07-31 10:36:04.297 VideoApp [2398:207]前回は52 2009-07-31 10:36:11.933 VideoApp [2398:207]前回は60 2009-07-31 10:36:11.952 VideoApp [2398:207]ムービーが終了しました:前回は0でした 2009-07-31 10:36:12.597 VideoApp [2398:207]前回は0だった 彼らはいつも最後に0を得ているようです。したがって、映画が実際に終了したのか、完了したボタンを押したのかを知る良い方法はありません。どのようにそれを修正するための任意のアイデア? –

+0

私は私が持っていると思ったときに私は正しく聞いていませんでした。完了通知が呼び出される前に、まだ最終出力が1つあることがわかります。再度、感謝します! –

1
`NSDictionary * userInfo = notification.userInfo; 
    int lastPositionInSeconds = [[userInfo valueForKey:@"MPAVControllerTimeParameter"] intValue]; 
`// saving an NSInteger 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    [prefs setInteger:lastPositionInSeconds forKey:@"currentMovieTime"]; 

    // getting an NSInteger 
     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
     NSInteger myInt = [prefs integerForKey:@"currentMovieTime"]; // default is zero if nil 
     currentMovieTime = myInt; 
     self.streamMoviePlayer.initialPlaybackTime = currentMovieTime; 

これを使用して変数を設定/取得し、それを使用して適切なタイミングでムービーを開始することができます。これは、ユーザーが電話を再起動したり、アプリケーションを再起動しても機能します。

関連する問題