如何处理YouTube片段OnSaveInstanceState [英] How to Handle YouTube Fragment OnSaveInstanceState

查看:76
本文介绍了如何处理YouTube片段OnSaveInstanceState的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

YouTube文档未明确说明在其API 文档(适用于Android)

The YouTube documentation does not clearly outline where to call seekToMillis() in the YouTube lifecycle of their API guide or documentation for Android.

为确保YouTube播放器在屏幕旋转时从其左边的位置起步,请按seekToMillis(...)键.但是,在loadVideo(...)play()之前或之后直接调用此方法无法正常工作.

In order to make sure the YouTube player picks up from where it left of when the screen is rotated seekToMillis(...) is required. However, this method does not work as expected being called directly before or after loadVideo(...) or play().

呼叫seekToMillis(...)以毫秒为单位在特定点开始播放视频.

Call seekToMillis(...) to start video at specific point in milliseconds.

推荐答案

解决方案

seekToMillis(...)方法在 YouTubePlayer.PlayerStateChangeListener 中发生事件后起作用.因此,可以将保存的实例状态束传递到为PlayerStateChangeListener创建的内部类中.

Solution

The seekToMillis(...) method works after events within the YouTubePlayer.PlayerStateChangeListener. Therefore, the saved instance state bundle can be passed into the inner class made for the PlayerStateChangeListener.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    binding = FragmentYoutubeDialogBinding.inflate(inflater, container, false)

    val youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance()

    youTubePlayerFragment.initialize(Auth.APP_API_ID, object : OnInitializedListener {

        override fun onInitializationSuccess(provider: Provider, player: YouTubePlayer, wasRestored: Boolean) {
            if (!wasRestored) {
                youtubePlayer = player
                player.setPlayerStateChangeListener(MyPlayerStateChangeListener(savedInstanceState))
                player.setPlaybackEventListener(MyPlaybackEventListener())
                player.loadVideo(arguments!!.getString(ITEM_ID))
                player.play()
            }
        }

        override fun onInitializationFailure(provider: Provider, result: YouTubeInitializationResult) {
            // TODO: add log statement.
        }
    })
    childFragmentManager.beginTransaction().replace(R.id.youtubePlayer, youTubePlayerFragment as Fragment).commit()

    return binding.root
}


private inner class MyPlayerStateChangeListener(var savedInstanceState: Bundle?) : YouTubePlayer.PlayerStateChangeListener {
    internal var playerState = "UNINITIALIZED"

    override fun onLoading() {
        playerState = "LOADING"
    }

    override fun onLoaded(videoId: String) {
        playerState = String.format("LOADED %s", videoId)
    }

    override fun onAdStarted() {
        playerState = "AD_STARTED"
    }

    override fun onVideoStarted() {
        if (savedInstanceState != null) {
            println("YT_CURRENT: " + savedInstanceState!!.getInt(YOUTUBE_CURRENT_TIME_KEY))
            youtubePlayer.seekToMillis(savedInstanceState!!.getInt(YOUTUBE_CURRENT_TIME_KEY))
            playerState = "VIDEO_STARTED"
        }
    }

这篇关于如何处理YouTube片段OnSaveInstanceState的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆