7

カスタムビデオビューの場合、MediaController をオーバーライドする必要がありました (ボタンのデザインを変更し、ボタンに接続して一時停止/セレクターを再生するため)。状況は次のとおりです。ビデオを一時停止してアプリケーションをオンにしてから再び復元すると、ビデオは一時停止された時点からではなく、再び再生を開始するため、問題が発生しました。ビデオの再生を開始する方法止めた場所から?VideoActivity で何を変更する必要がありますか?

public class VideoActivity extends Activity {

    VideoView videoView;

    VkMediaController mc;

    private static final String CURRENT = "duration";

    private static final String URL = "url";

    private Uri mURI;

    private int mCurrentPosition = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.video_view_player);
        videoView = (VideoView) findViewById(R.id.videoViewplayer);
        mc = new VkMediaController(this);
        mURI = getIntent().getData();
        if (savedInstanceState != null) {
            mURI = Uri.parse(savedInstanceState.getString(URL));
            mCurrentPosition = savedInstanceState.getInt(CURRENT);

        }
        videoView.setMediaController(mc);
        videoView.setVideoURI(mURI);
        videoView.requestFocus();
    }

    @Override
    protected void onStart() {
        super.onStart();
        videoView.start();
        if (mCurrentPosition != -1) {
            videoView.seekTo(mCurrentPosition);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(CURRENT, videoView.getCurrentPosition());
        outState.putString(URL, mURI.toString());
        super.onSaveInstanceState(outState);
    }
}
4

3 に答える 3

22

videoView.getCurrentPosition()問題は、内部で呼び出すと常に 0 が返されることだと思いますが、onSaveInstanceState(Bundle outState)その時点でビデオはすでにリセットされているため、 を呼び出すとvideoView.getCurrentPosition()onPause()目的の値が返されます。

于 2012-09-27T08:54:33.260 に答える
2

私も同じ問題を抱えていました。私はすべてを正しくやったと思っていましたが、うまくいきませんでした。次に、順序を変更したので、最初に呼び出しVideoView.seekTo()てからVideoView.start(). それはうまくいきました。私もVideoView.requestFocus()そこにいますが、それが重要かどうかはわかりません。

videoPlayer.requestFocus();
videoPlayer.seekTo(position);
videoPlayer.start();

したがって、位置変数に正しい値があると確信している場合は、これが答えかもしれません。ビデオがロードされていない場合、シークできない場合があります。onPreparedListener を次のように実装します。

public class VideoActivity extends Activity implements OnPreparedListener {
    VideoView videoPlayer;
    int position;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState!=null){
    position=savedInstanceState.getInt("pos")
    }
    // setting up the videoview
    setContentView(R.layout.activity_video);
    getIntent().getExtras().getString("url");
    Uri videouri = Uri.parse(getIntent().getExtras().getString("url"));
    videoPlayer = (VideoView) findViewById(R.id.videoView);
    videoPlayer.setOnPreparedListener(this);
    videoPlayer.setKeepScreenOn(true);
    videoPlayer.setVideoURI(videouri);

    }

    /**
     * Start the plaback when the video is loaded
     * 
     * @param mp
     * @see android.media.MediaPlayer.OnPreparedListener#onPrepared(android.media.MediaPlayer)
     */
    public void onPrepared(MediaPlayer mp) {
    //this is a TextView infront of the VideoView which tells the User the Video is loading- hide that
    findViewById(R.id.tv_video_load).setVisibility(View.GONE);

    videoPlayer.requestFocus();
    videoPlayer.seekTo(position)
    videoPlayer.start();
}
}
于 2012-09-27T09:01:37.680 に答える