如何在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
相关产品推荐
相关产品推荐

