【问题标题】:Android Studio (Kotlin) - VideoView Goes Black After Switching AppsAndroid Studio (Kotlin) - 切换应用后 VideoView 变黑
【发布时间】:2021-12-24 03:58:47
【问题描述】:

我在主要活动的底部三分之一处循环播放了一个非常简单的视频。当应用程序被最小化然后我回到它时,视频将停止播放,而是显示黑屏,似乎没有办法让它再次播放。 (我不想要视频控件。)

这是我的 MainActivity.kt:

import android.app.ActionBar
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.VideoView
import androidx.appcompat.app.AppCompatActivity

import android.widget.TextView
import android.graphics.drawable.ColorDrawable

class MainActivity :  AppCompatActivity() {

    // declaring a null variable for VideoView
    var simpleVideoView: VideoView? = null

    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        supportActionBar?.setDisplayShowTitleEnabled(false)
        supportActionBar?.hide()

        // assigning id of VideoView from
        // activity_main.xml layout file
        simpleVideoView = findViewById<View>(R.id.videoView) as VideoView

        // set the absolute path of the video file which is going to be played
        simpleVideoView!!.setVideoURI(Uri.parse("android.resource://"
                + packageName + "/" + R.raw.gp))

        simpleVideoView!!.requestFocus()

        // starting the video
        simpleVideoView!!.start()

        simpleVideoView!!.setOnCompletionListener { simpleVideoView!!.start() }

    }

}

【问题讨论】:

  • 查看文档:“VideoView 在进入后台时不会保持其完整状态。特别是,它不会恢复当前的播放状态、播放位置、选定的轨道或通过 addSubtitleSource 添加的任何字幕轨道()。应用程序应在 Activity.onSaveInstanceState(Bundle) 和 Activity.onRestoreInstanceState(Bundle) 中自行保存和恢复这些。"
  • @Cristi 谢谢你的回答。我是 Android 和 Kotlin 的新手,充其量是一般的编码爱好者。您能否详细说明将您所指的代码放在哪里? (这只是我个人使用的一个很小的应用程序,所以它不一定是完美的。)

标签: android android-studio kotlin android-videoview


【解决方案1】:

最简单的解决方案是:

类 MainActivity : AppCompatActivity() {

    var simpleVideoView: VideoView? = null
    var currentPosition = 0

    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        supportActionBar?.setDisplayShowTitleEnabled(false)
        supportActionBar?.hide()

    
        simpleVideoView = findViewById<View>(R.id.videoView) as VideoView

        
        simpleVideoView!!.setVideoURI(Uri.parse("android.resource://"
            + packageName + "/" + R.raw.gp))

        simpleVideoView!!.setOnCompletionListener {     simpleVideoView!!.start() }

    if (savedInstanceState != null) {
        var position = savedInstanceState.getInt("position")
        simpleVideoView!!.seekTo(position)
    }

}

    override fun onStart() {
        super.onStart()
        if (currentPosition != 0)
             simpleVideoView!!.seekTo(currentPosition)

        simpleVideoView!!.start()

    }

    override fun onResume() {
        super.onResume()
        if (!simpleVideoView!!.isPlaying) {
            if (currentPosition != 0)
                simpleVideoView!!.seekTo(currentPosition)

            simpleVideoView!!.start()
        }
    }

    override fun onPause() {
        super.onPause()
        simpleVideoView!!.pause()
        currentPosition = simpleVideoView!!.currentPosition
    }

    override fun onStop() {
         simpleVideoView!!.pause()
         super.onStop()
     }

    override fun onSaveInstanceState(outState: Bundle) {
        outState.putInt("position", currentPosition)
        super.onSaveInstanceState(outState)
    }

}

这会在旋转设备时在其离开的同一点重新开始播放视频。您可能想从 android 而不是 VideoView 中查看 exoplayer。

【讨论】:

  • 这解决了我的问题。非常感谢!
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多