Android Studio Kotlin开发中VideoView切换应用后黑屏无法播放问题
问题原因
- 你当前只在
onCreate生命周期中初始化并启动了VideoView,当应用切到后台时,Activity会触发onPause回调,系统会回收VideoView持有的渲染资源、暂停播放;当切回前台触发onResume时,你没有实现对应的恢复播放逻辑,就会出现黑屏、无法继续播放的问题。 - 你当前用
setOnCompletionListener实现循环播放的方式稳定性较差,切后台后播放状态丢失,回调也不会正常触发。
修复方案
修改点如下:
- 重写Activity的
onResume方法,在切回前台时判断视频状态,恢复播放 - 重写
onPause方法,在切后台时记录当前播放进度,暂停播放释放资源 - 替换自定义的完成监听器为
VideoView自带的setLooping(true)实现循环播放,兼容性更好 - 替换不安全的
!!强制非空调用,改用空安全调用避免崩溃
修改后的完整代码:
import android.net.Uri import android.os.Bundle import android.widget.VideoView import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { private var simpleVideoView: VideoView? = null // 记录切后台时的播放进度 private var currentPosition = 0 override fun onCreate(savedInstanceState: Bundle?){ super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) supportActionBar?.setDisplayShowTitleEnabled(false) supportActionBar?.hide() simpleVideoView = findViewById(R.id.videoView) // 初始化视频资源 simpleVideoView?.setVideoURI(Uri.parse("android.resource://" + packageName + "/" + R.raw.gp)) // 开启循环播放 simpleVideoView?.setLooping(true) simpleVideoView?.requestFocus() } override fun onResume() { super.onResume() simpleVideoView?.let { // 切回前台时跳到之前记录的进度继续播放 it.seekTo(currentPosition) it.start() currentPosition = 0 } } override fun onPause() { super.onPause() simpleVideoView?.let { // 切后台时记录当前播放进度,暂停播放 currentPosition = it.currentPosition it.pause() } } override fun onDestroy() { super.onDestroy() // 页面销毁时释放资源 simpleVideoView?.stopPlayback() simpleVideoView = null } }
额外说明
- 你要求的隐藏视频控件需求当前逻辑已经满足,
VideoView默认不会加载系统控制栏,只要你没有关联MediaController就不会显示控件。 - 底部三分之一区域的布局只要在xml中给
VideoView设置对应高度限制即可,和播放逻辑无关不需要修改代码。
内容的提问来源于stack exchange,提问作者madmoneymike5
相关产品推荐
相关产品推荐

