【问题标题】:Jetpack compose: Can't use Youtube APIJetpack compose:无法使用 Youtube API
【发布时间】:2021-11-19 14:21:36
【问题描述】:

我正在研究一天,但没有得到任何关于使用 jetpack compose 的 youtube API 的参考。是否可以在 jetpack compose 上使用它,或者有没有其他方法可以使用 jetpack compose 播放 youtube 视频?请帮帮我

【问题讨论】:

  • 您尝试了什么,遇到了什么问题?例如,您是否try using AndroidView
  • 我找到了有关如何使用 jetpack compose 播放视频的教程。我想你可以使用它。 itnext.io/playing-a-video-with-jetpack-compose-10a453ff956
  • @CommonsWare 我做到了,但它抛出了一个错误,提示“只能使用扩展 YouTubeBaseActivity 作为其上下文的 Activity 创建 YouTubePlayerView。”
  • 您的活动是否扩展YouTubeBaseActivity
  • @Tanjimahmed 请在您的问题中添加所有信息,如已阅读,没有足够的信息用于调试、研究或做任何帮助。

标签: android youtube-api android-jetpack-compose


【解决方案1】:

确实,很棘手。

你不能使用 YouTubeBaseActivity,意味着你不能使用 YouTubePlayerView。此视图创建为仅在一种活动类型中工作,而不是为您的片段/组合架构创建的。

您不能使用 YouTubePlayerFragment,因为它的父源来自已弃用的 android.app 包,您将无法在花哨的撰写活动中获取旧的 fragmentManager。

您可以并且必须将 YouTubePlayerSupportFragment 与撰写活动片段管理器(它是 androidx.fragment.app.FragmentManager 的实例)一起使用。

以下代码在我这边运行良好,试试看:

@Composable
fun ComposeYoutube(
    modifier: Modifier,
    playList: List<String>,
    supportFragmentManager: FragmentManager,
    onError: (String) -> Unit
) {

    AndroidView(
        modifier = modifier,
        factory = {
            var player: YouTubePlayer? = null

            val onPlaylistChangeListener = object : YouTubePlayer.PlaylistEventListener {
                override fun onPlaylistEnded() {}
                override fun onPrevious() {}
                override fun onNext() {}
            }


            val youtubeApiInitializedListener = object : YouTubePlayer.OnInitializedListener {
                override fun onInitializationSuccess(p0: YouTubePlayer.Provider?, p1: YouTubePlayer?, p2: Boolean) {
                    player = p1
                    player?.setPlaylistEventListener(onPlaylistChangeListener)
                    player?.loadVideos(playList)
                }

                override fun onInitializationFailure(p0: YouTubePlayer.Provider?, p1: YouTubeInitializationResult?) {
                    onError("TODO")
                }
            }

            FrameLayout(it).apply {
                // select any R.id.X from your project, it does not matter what it is, but container must have one for transaction below.
                id = R.id.tv_id

                val youtubeView = YouTubePlayerSupportFragment()

                supportFragmentManager
                    .beginTransaction()
                    .add(
                        R.id.tv_id,
                        youtubeView,
                        null
                    )
                    .commit()

                youtubeView.initialize(BuildConfig.youtubeApi, youtubeApiInitializedListener)
            }
        },
        update = { }
    )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2023-01-10
    相关资源
    最近更新 更多