【问题标题】:How to Handle YouTube Fragment OnSaveInstanceState如何处理 YouTube 片段 OnSaveInstanceState
【发布时间】:2018-09-24 14:39:02
【问题描述】:

问题

YouTube 文档没有明确概述在其 API guide 或 Android 的 documentation 的 YouTube 生命周期中调用 seekToMillis() 的位置。

为了确保 YouTube 播放器在屏幕旋转时从其左侧开始播放,seekToMillis(...) 是必需的。但是,在 loadVideo(...)play() 之前或之后直接调用此方法无法按预期工作。

预期

调用seekToMillis(...) 以毫秒为单位在特定时间点开始视频。

【问题讨论】:

    标签: android android-fragments youtube-api android-youtube-api


    【解决方案1】:

    解决方案

    seekToMillis(...) 方法在 YouTubePlayer.PlayerStateChangeListener 内的事件之后起作用。因此,保存的实例状态包可以传递到为 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"
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2011-07-16
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多