You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android中使用VideoView实现视频断点续播?

解决VideoView重启后无法续播的问题

嘿,这个问题我之前也碰到过!你的代码现在没有保存视频的播放进度,所以每次重启应用都会从头开始。别担心,只要添加保存播放位置和恢复播放位置的逻辑就能轻松搞定啦。

问题根源

当前代码只负责启动视频播放,但没有记录用户上次看到哪里了。当应用被关闭后,之前的播放位置就丢失了,所以重启后只能从头播放。

解决方案步骤

我们可以用SharedPreferences来持久化保存播放进度(比onSaveInstanceState更可靠,因为用户主动关闭应用时onSaveInstanceState可能不会触发),然后在视频准备好后恢复到上次的位置。

1. 调整成员变量

首先把VideoView改成Activity的成员变量,这样在其他生命周期方法里也能访问到:

private VideoView videoView;
private static final String PLAYBACK_POSITION = "playback_position";

2. 保存播放进度

在onPause()方法中保存当前的播放位置,确保应用切换到后台或关闭时进度不会丢失:

@Override
protected void onPause() {
    super.onPause();
    // 仅在视频播放状态下保存进度
    if (videoView != null && videoView.isPlaying()) {
        int currentPosition = videoView.getCurrentPosition();
        SharedPreferences prefs = getSharedPreferences("VideoPlayerPrefs", MODE_PRIVATE);
        prefs.edit().putInt(PLAYBACK_POSITION, currentPosition).apply();
    }
}

3. 恢复播放进度

在视频准备完成后,读取保存的进度并跳转到对应位置。我们通过setOnPreparedListener来监听视频准备状态,避免视频未加载完成就跳转导致异常:

videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        // 读取之前保存的播放位置
        SharedPreferences prefs = getSharedPreferences("VideoPlayerPrefs", MODE_PRIVATE);
        int savedPosition = prefs.getInt(PLAYBACK_POSITION, 0);
        if (savedPosition > 0) {
            videoView.seekTo(savedPosition);
        }
        videoView.start();
    }
});

完整修改后的代码

package com.example.praythisworks;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;
import android.net.Uri;
import android.media.MediaPlayer;
import android.content.SharedPreferences;

public class MainActivity extends AppCompatActivity {
    private VideoView videoView;
    private static final String PLAYBACK_POSITION = "playback_position";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        videoView = findViewById(R.id.vdVw);
        
        // 设置媒体控制器,支持播放、暂停等操作
        MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(videoView);
        videoView.setMediaController(mediaController);
        
        // 设置本地视频资源URI
        Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.thefeels);
        videoView.setVideoURI(uri);
        videoView.requestFocus();
        
        // 监听视频准备状态,恢复上次播放位置
        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                SharedPreferences prefs = getSharedPreferences("VideoPlayerPrefs", MODE_PRIVATE);
                int savedPosition = prefs.getInt(PLAYBACK_POSITION, 0);
                if (savedPosition > 0) {
                    videoView.seekTo(savedPosition);
                }
                videoView.start();
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 保存当前播放进度到SharedPreferences
        if (videoView != null && videoView.isPlaying()) {
            int currentPosition = videoView.getCurrentPosition();
            SharedPreferences prefs = getSharedPreferences("VideoPlayerPrefs", MODE_PRIVATE);
            prefs.edit().putInt(PLAYBACK_POSITION, currentPosition).apply();
        }
    }
}

额外说明

  • 用SharedPreferences保存进度,即使用户主动关闭应用,下次打开也能精准恢复;
  • 在onPrepared里调用seekTo,确保视频加载完成后再跳转位置,避免出现异常;
  • 加了videoView.isPlaying()的判断,只在视频播放时保存进度,避免无效存储。

这样修改后,你的视频播放器就能支持续播功能啦!

内容的提问来源于stack exchange,提问作者Melli Flour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:43:10