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

Android Studio Kotlin开发中VideoView切换应用后黑屏无法播放问题

问题原因
  • 你当前只在onCreate生命周期中初始化并启动了VideoView,当应用切到后台时,Activity会触发onPause回调,系统会回收VideoView持有的渲染资源、暂停播放;当切回前台触发onResume时,你没有实现对应的恢复播放逻辑,就会出现黑屏、无法继续播放的问题。
  • 你当前用setOnCompletionListener实现循环播放的方式稳定性较差,切后台后播放状态丢失,回调也不会正常触发。
修复方案

修改点如下:

  1. 重写Activity的onResume方法,在切回前台时判断视频状态,恢复播放
  2. 重写onPause方法,在切后台时记录当前播放进度,暂停播放释放资源
  3. 替换自定义的完成监听器为VideoView自带的setLooping(true)实现循环播放,兼容性更好
  4. 替换不安全的!!强制非空调用,改用空安全调用避免崩溃

修改后的完整代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:57:06