首页 > 解决方案 > 在画中画模式下播放 Youtube 视频

问题描述

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

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

标签: androidkotlinyoutubeandroid-youtube-apipicture-in-picture

解决方案


好吧,我终于让它工作了。

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, 0,
                            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()
    }
}

推荐阅读