android - 在画中画模式下播放 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, 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()
}
}
推荐阅读
- r - 如何访问 R 的链式 data.table 中的行名
- c# - Agora.io 生成的令牌无效(C#/Angular)
- java - 如何在 JUNIT 的方法中为使用字符串和数组之和的 IF 语句编写测试
- kotlin - 为什么 Kotlin 有可变版本的集合?
- python - 如何将字典存储在可以加密的文件中?
- kotlin - Kotlin - 如何对矩阵的每个元素应用模运算?
- perforce - Perforce:提交的文件与工作区版本不匹配
- python - 如何在 Jupyter Notebook 中导入 CSV 文件?
- swift - 当我从另一个类调用时发送到实例的无法识别的选择器
- python - crontab 和 ImportError:没有名为 psycopg2 的模块