【问题标题】:Android Kotlin - ExoPlayer keeps playing when app goes to backgroundAndroid Kotlin - 当应用程序进入后台时,ExoPlayer 继续播放
【发布时间】:2022-01-06 23:48:52
【问题描述】:

到目前为止,我只发现了有关如何让 ExoPlayer 在应用程序进入后台时继续播放的问题。为什么我没有编码这个bs的情况是这样的??

这是我目前所拥有的,它在 RecyclerView OnBingViewHolder 中:

val player = ExoPlayer.Builder(context).build()
val mediaItem: MediaItem = MediaItem.fromUri(fileUrl)
player.setMediaItem(mediaItem)
player.repeatMode = Player.REPEAT_MODE_ONE
holder.vidPlayer.player = player
player.prepare()
player.seekTo(100)
// player.play()
holder.vidPlayer.setTag(mpTag, player)
holder.vidPlayer.setTag(manuelPlayTag, false)
holder.vidPlayer.setTag(manuelPauseTag, false)

player.addListener(object : Player.Listener { // player listener

    override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
        if (playWhenReady && playbackState == Player.STATE_READY) {
            Log.d(tagg, "state: plays")
            holder.vidPlayer.hideController()
        } else if (playWhenReady) {
            // might be idle (plays after prepare()),
            // buffering (plays when data available)
            // or ended (plays when seek away from end)
        } else {
            Log.d(tagg, "state: pause")
            holder.vidPlayer.showController()
        }
    }
})

当应用进入后台时如何防止播放?

【问题讨论】:

    标签: android kotlin exoplayer exoplayer2.x


    【解决方案1】:

    当您的应用程序进入后台时,将调用活动的 Fragment/Activity 的生命周期方法 onPause(和 onStop)。在onPause 方法中,您可以cycle through your bound ViewHolders 并停止视频播放器。

    【讨论】:

    • 这是我的计划,我只是希望 ExoPlayer 中有一个设置可以防止这种情况发生,而不是采取这种解决方法。谢谢,除非有人有更舒适的解决方案,否则我会检查您的答案:)
    • @CoffeeJunkie ExoPlayer 在自己的线程上运行(也有自己的后台线程),因此它会一直运行,除非您告诉它停止。这适用于您启动的任何线程,或任何处理它们自己的线程的组件 - 它允许您保持在后台运行的东西,但这也意味着您需要自己清理东西。这是 Android 中的一般概念 - 当应用程序进入后台时,您需要停止正在运行的东西并释放资源。生命周期感知的东西可以自动处理,但通常你必须明确地为它提供一个
    • 这也有它的优点。感谢@cactustictacs的详细解释
    【解决方案2】:

    当应用程序进入后台时,您可以简单地stop ExoPlayer。

    override fun onStop() {
        super.onStop()
        simpleExoPlayer.stop()
    }
    

    onStart 中,又是prepare() ExoPlayer:

    override fun onStart() {
        super.onStart()
        simpleExoPlayer.prepare()
    }
    

    为了自动播放媒体,您需要设置playWhenReady = true

    simpleExoPlayer.playWhenReady = true
    

    通过设置playWhenReady = true,它会自动播放内容,我们不需要显式调用simpleExoPlayer.play()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2014-01-06
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多