mirror of
https://github.com/lizongying/my-tv.git
synced 2026-11-03 01:56:31 +08:00
fix still playing after exit
This commit is contained in:
@@ -5,9 +5,11 @@ import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.ViewTreeObserver
|
||||
import androidx.annotation.OptIn
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.PlaybackException
|
||||
import androidx.media3.common.Player
|
||||
import androidx.media3.common.VideoSize
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
@@ -19,10 +21,10 @@ import com.lizongying.mytv.models.TVViewModel
|
||||
|
||||
class PlayerFragment : Fragment() {
|
||||
|
||||
private var lastVideoUrl: String = ""
|
||||
|
||||
private var _binding: PlayerBinding? = null
|
||||
private var playerView: PlayerView? = null
|
||||
private var videoUrl: String? = null
|
||||
private var tvViewModel: TVViewModel? = null
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
@@ -30,43 +32,80 @@ class PlayerFragment : Fragment() {
|
||||
): View {
|
||||
_binding = PlayerBinding.inflate(inflater, container, false)
|
||||
playerView = _binding!!.playerView
|
||||
(activity as MainActivity).playerFragment = this
|
||||
playerView?.viewTreeObserver?.addOnGlobalLayoutListener(object :
|
||||
ViewTreeObserver.OnGlobalLayoutListener {
|
||||
override fun onGlobalLayout() {
|
||||
playerView!!.viewTreeObserver.removeOnGlobalLayoutListener(this)
|
||||
playerView!!.player = activity?.let {
|
||||
ExoPlayer.Builder(it)
|
||||
.build()
|
||||
}
|
||||
playerView!!.player?.playWhenReady = true
|
||||
playerView!!.player?.addListener(object : Player.Listener {
|
||||
override fun onVideoSizeChanged(videoSize: VideoSize) {
|
||||
val aspectRatio = 16f / 9f
|
||||
val layoutParams = playerView?.layoutParams
|
||||
layoutParams?.width =
|
||||
(playerView?.measuredHeight?.times(aspectRatio))?.toInt()
|
||||
playerView?.layoutParams = layoutParams
|
||||
}
|
||||
//
|
||||
// override fun onPlayerError(error: PlaybackException) {
|
||||
// super.onPlayerError(error)
|
||||
// }
|
||||
})
|
||||
if (videoUrl !== null) {
|
||||
playerView!!.player?.run {
|
||||
videoUrl?.let { MediaItem.fromUri(it) }?.let { setMediaItem(it) }
|
||||
prepare()
|
||||
}
|
||||
videoUrl = null
|
||||
}
|
||||
}
|
||||
})
|
||||
Log.i(TAG, "PlayerFragment onCreateView")
|
||||
return _binding!!.root
|
||||
}
|
||||
|
||||
@OptIn(UnstableApi::class)
|
||||
fun play(tvModel: TVViewModel) {
|
||||
val videoUrl = tvModel.videoIndex.value?.let { tvModel.videoUrl.value?.get(it) }
|
||||
if (videoUrl == null || videoUrl == "") {
|
||||
Log.e(TAG, "${tvModel.title.value} videoUrl is empty")
|
||||
return
|
||||
}
|
||||
|
||||
if (videoUrl == lastVideoUrl) {
|
||||
Log.e(TAG, "videoUrl is duplication")
|
||||
return
|
||||
}
|
||||
|
||||
lastVideoUrl = videoUrl
|
||||
|
||||
if (playerView!!.player == null) {
|
||||
playerView!!.player = activity?.let {
|
||||
ExoPlayer.Builder(it)
|
||||
.build()
|
||||
fun play(tvViewModel: TVViewModel) {
|
||||
this.tvViewModel = tvViewModel
|
||||
val videoUrlCurrent =
|
||||
tvViewModel.videoIndex.value?.let { tvViewModel.videoUrl.value?.get(it) }
|
||||
if (playerView == null || playerView?.player == null) {
|
||||
Log.i(TAG, "playerView not ready $view}")
|
||||
videoUrl = videoUrlCurrent
|
||||
} else {
|
||||
Log.i(TAG, "playerView ok")
|
||||
playerView?.player?.run {
|
||||
val mediaItem = MediaItem.Builder()
|
||||
tvViewModel.id.value?.let { mediaItem.setMediaId(it.toString()) }
|
||||
videoUrlCurrent?.let { mediaItem.setUri(it) }
|
||||
setMediaItem(mediaItem.build())
|
||||
prepare()
|
||||
}
|
||||
playerView!!.player?.playWhenReady = true
|
||||
playerView!!.player?.addListener(object : Player.Listener {
|
||||
override fun onVideoSizeChanged(videoSize: VideoSize) {
|
||||
val aspectRatio = 16f / 9f
|
||||
val layoutParams = playerView?.layoutParams
|
||||
layoutParams?.width = (playerView?.measuredHeight?.times(aspectRatio))?.toInt()
|
||||
playerView?.layoutParams = layoutParams
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
playerView!!.player?.run {
|
||||
setMediaItem(MediaItem.fromUri(videoUrl))
|
||||
prepare()
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
if (playerView != null) {
|
||||
playerView!!.player?.stop()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (playerView != null) {
|
||||
playerView!!.player?.play()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
if (playerView != null) {
|
||||
playerView!!.player?.release()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user