From 83a70291d4044e32cbc53f3d8fe95ad5cee462ae Mon Sep 17 00:00:00 2001 From: Li ZongYing Date: Fri, 16 Feb 2024 22:13:59 +0800 Subject: [PATCH] fix tianmao-mohe --- app/build.gradle | 4 ++ .../com/lizongying/mytv/PlayerFragment.kt | 49 +++++++++++++++++-- .../main/java/com/lizongying/mytv/Utils.kt | 3 ++ app/src/main/res/layout/player.xml | 8 +++ 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 81372c3..12e10ad 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,4 +113,8 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.11.0' implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2" implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0-RC") + + implementation 'com.google.android.exoplayer:exoplayer-ui:2.13.3' + implementation 'com.google.android.exoplayer:exoplayer-core:2.13.3' + implementation 'com.google.android.exoplayer:exoplayer-hls:2.13.3' } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt index 89aa03c..b7b987b 100644 --- a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt @@ -3,6 +3,8 @@ package com.lizongying.mytv import android.os.Bundle import android.util.Log import android.view.LayoutInflater +import android.view.SurfaceHolder +import android.view.SurfaceView import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver @@ -15,24 +17,39 @@ import androidx.media3.common.VideoSize import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import androidx.media3.ui.PlayerView +import com.google.android.exoplayer2.SimpleExoPlayer import com.lizongying.mytv.databinding.PlayerBinding import com.lizongying.mytv.models.TVViewModel -class PlayerFragment : Fragment() { +class PlayerFragment : Fragment(), SurfaceHolder.Callback { private var _binding: PlayerBinding? = null private var playerView: PlayerView? = null private var tvViewModel: TVViewModel? = null private val aspectRatio = 16f / 9f + + private lateinit var surfaceView: SurfaceView + private lateinit var surfaceHolder: SurfaceHolder + private var exoPlayer: SimpleExoPlayer? = null + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = PlayerBinding.inflate(inflater, container, false) - playerView = _binding!!.playerView - (activity as MainActivity).playerFragment = this + + if (Utils.isTmallDevice()) { + _binding!!.playerView.visibility = View.GONE + surfaceView = _binding!!.surfaceView + surfaceHolder = surfaceView.holder + surfaceHolder.addCallback(this) + } else { + _binding!!.surfaceView.visibility = View.GONE + playerView = _binding!!.playerView + } + playerView?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { @@ -78,6 +95,10 @@ class PlayerFragment : Fragment() { setMediaItem(MediaItem.fromUri(tvViewModel.getVideoUrlCurrent())) prepare() } + exoPlayer?.run { + setMediaItem(com.google.android.exoplayer2.MediaItem.fromUri(tvViewModel.getVideoUrlCurrent())) + prepare() + } } override fun onStart() { @@ -86,8 +107,10 @@ class PlayerFragment : Fragment() { if (playerView != null && playerView!!.player?.isPlaying == false) { Log.i(TAG, "replay") playerView!!.player?.prepare() - } else { - Log.i(TAG, "playing") + } + if (exoPlayer?.isPlaying == false) { + Log.i(TAG, "replay") + exoPlayer?.prepare() } } @@ -101,6 +124,9 @@ class PlayerFragment : Fragment() { if (playerView != null && playerView!!.player?.isPlaying == true) { playerView!!.player?.stop() } + if (exoPlayer?.isPlaying == true) { + exoPlayer?.stop() + } } override fun onDestroy() { @@ -108,6 +134,7 @@ class PlayerFragment : Fragment() { if (playerView != null) { playerView!!.player?.release() } + exoPlayer?.release() } override fun onDestroyView() { @@ -118,4 +145,16 @@ class PlayerFragment : Fragment() { companion object { private const val TAG = "PlaybackVideoFragment" } + + override fun surfaceCreated(holder: SurfaceHolder) { + exoPlayer = SimpleExoPlayer.Builder(requireContext()).build() + exoPlayer?.setVideoSurfaceHolder(surfaceHolder) + exoPlayer?.playWhenReady = true + } + + override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { + } + + override fun surfaceDestroyed(holder: SurfaceHolder) { + } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/Utils.kt b/app/src/main/java/com/lizongying/mytv/Utils.kt index ab095a7..657d77c 100644 --- a/app/src/main/java/com/lizongying/mytv/Utils.kt +++ b/app/src/main/java/com/lizongying/mytv/Utils.kt @@ -1,6 +1,7 @@ package com.lizongying.mytv import android.content.res.Resources +import android.os.Build import android.util.TypedValue import com.google.gson.Gson import com.lizongying.mytv.api.TimeResponse @@ -71,4 +72,6 @@ object Utils { TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), Resources.getSystem().displayMetrics ).toInt() } + + fun isTmallDevice() = Build.MANUFACTURER.equals("Tmall", ignoreCase = true) } \ No newline at end of file diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index f31a7c8..ef52f4d 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -7,6 +7,14 @@ android:background="@color/black" android:keepScreenOn="true"> + +