以画中画模式播放 YouTube 视频

问题描述

我的应用程序包含指向 youtube 视频的链接,我想要的是当用户点击图片时,相应的 youtube 视频应该在浮动窗口中播放,就像在 WhatsApp 中一样。

有没有办法在不使用任何新依赖的情况下实现这一目标?如果没有,请指导我如何做到这一点。

解决方法

好吧,我终于成功了。

import android.app.PendingIntent
import android.app.PictureInPictureParams
import android.app.RemoteAction
import android.content.Intent
import android.content.res.Configuration
import android.graphics.drawable.Icon
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.util.Rational
import android.view.Window
import android.widget.Toast
import com.google.android.youtube.player.YouTubeBaseActivity
import com.google.android.youtube.player.YouTubeInitializationResult
import com.google.android.youtube.player.YouTubePlayer
import com.nishanatthani.nnfda.R
import com.nishanatthani.nnfda.databinding.ActivityMainBinding


class MainActivity : YouTubeBaseActivity() {
    private lateinit var bind: ActivityMainBinding
    private val RECOVERY_REQUEST = 1
    private var yPlayer: YouTubePlayer? = null
    private lateinit var yListener: YouTubePlayer.OnInitializedListener
    private val apiKey: String = "<API_KEY>"
    private var id: String = "a"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        bind = ActivityMainBinding.inflate(layoutInflater)
        requestWindowFeature(Window.FEATURE_NO_TITLE)
        setContentView(bind.root)
        if (intent != null) {
            id = intent.getStringExtra("id").toString()
            if (id == "a") {
                onBackPressed()
            }
        } else {
            onBackPressed()
        }
        initializeListener()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val actions = ArrayList<RemoteAction>()
                .add(
                    RemoteAction(
                        Icon.createWithResource(
                            this@MainActivity,R.drawable.ic_right
                        ),"Play"," ",PendingIntent.getActivity(
                            this@MainActivity,Intent(
                                Intent.ACTION_VIEW,Uri.parse("https://www.youtube.com/channel/UCC8Z-Sv-pUsKtQof9ROm3hw/videos")
                            ),PendingIntent.FLAG_ONE_SHOT
                        )
                    )
                )
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val pParams = PictureInPictureParams.Builder()
            pParams.setAspectRatio(
                Rational(340,150)
            )
            enterPictureInPictureMode(pParams.build())
        } else {
            getYouTubePlayerProvider().initialize(apiKey,yListener)
        }
    }

    private fun initializeListener() {
        yListener = object : YouTubePlayer.OnInitializedListener {
            override fun onInitializationSuccess(
                provider: YouTubePlayer.Provider?,player: YouTubePlayer?,wasRestored: Boolean
            ) {
                yPlayer = player
                Log.e("InitializtionS1",wasRestored.toString())
                if (!wasRestored) {
                    player?.loadVideo(id)
                }
                player?.setPlaybackEventListener(object : YouTubePlayer.PlaybackEventListener {
                    override fun onPlaying() {
                        Log.d("Playback","Playing")
                    }

                    override fun onPaused() {
                        Log.d("Playback","Paused")
                    }

                    override fun onStopped() {
//                finish()
                        Log.d("Playback","Stopped")
                    }

                    override fun onBuffering(p0: Boolean) {
                        Log.d("Playback","Buffering")
                    }

                    override fun onSeekTo(p0: Int) {
                        Log.d("Playback","Seek")
                    }
                })

                player?.setPlayerStateChangeListener(object :
                    YouTubePlayer.PlayerStateChangeListener {
                    override fun onLoading() {
                        Log.d("State","Loading")
                    }

                    override fun onLoaded(p0: String?) {
//                player.play()
                        Log.d("State","Loaded")
                    }

                    override fun onAdStarted() {
                        Log.d("State","Ad")
                    }

                    override fun onVideoStarted() {
                        Log.d("State","Started")
                    }

                    override fun onVideoEnded() {
                        Log.d("State","Ended")
                        finish()
                    }

                    override fun onError(p0: YouTubePlayer.ErrorReason?) {
                        Log.e("YPlayer","Error ${p0?.name}")
//                Toast.makeText(this@MainActivity,"Error ${p0?.name}",Toast.LENGTH_LONG).show()
                        player.play()
                    }

                })
            }

            override fun onInitializationFailure(
                provider: YouTubePlayer.Provider?,errorReason: YouTubeInitializationResult?
            ) {
                if (errorReason?.isUserRecoverableError == true) {
                    errorReason.getErrorDialog(this@MainActivity,RECOVERY_REQUEST).show()
                } else {
                    Toast.makeText(
                        this@MainActivity,"Player Error ${errorReason.toString()})",Toast.LENGTH_LONG
                    )
                        .show()
                }
            }


        }

    }

    override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
        if (requestCode == RECOVERY_REQUEST) {
            // Retry initialization if user performed a recovery action
            getYouTubePlayerProvider().initialize(apiKey,yListener)
        }
        super.onActivityResult(requestCode,resultCode,data)
    }

    private fun getYouTubePlayerProvider(): YouTubePlayer.Provider {
        return bind.player
    }

    override fun onPictureInPictureRequested(): Boolean {
        Log.e("Pip Requested","Requested")
        return super.onPictureInPictureRequested()
    }

    override fun onPictureInPictureModeChanged(
        isInPictureInPictureMode: Boolean,newConfig: Configuration?
    ) {
        getYouTubePlayerProvider().initialize(apiKey,yListener)
        Log.e("PlayerPip",isInPictureInPictureMode.toString())
        super.onPictureInPictureModeChanged(isInPictureInPictureMode,newConfig)
    }

    override fun onBackPressed() {
        finish()
        super.onBackPressed()
    }
}