Jetpack compose:无法使用 Youtube API

Posted

技术标签:

【中文标题】Jetpack compose:无法使用 Youtube API【英文标题】:Jetpack compose: Can't use 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 请在您的问题中添加所有信息,如已阅读,没有足够的信息用于调试、研究或做任何帮助。 【参考方案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 =  
    )

【讨论】:

以上是关于Jetpack compose:无法使用 Youtube API的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试使用 jetpack compose 在 Android 中设置背景图像,但图像无法填满整个页面

Jetpack compose 更新到 1.0.0-rc01 后无法预览

如何使用 Jetpack Compose 使 LinearProgressIndicator 宽度动态化

Jetpack Compose 和 Hilt 冲突

尝试jetpack compose时显示错误:编译器后端并且无法由旧编译器加载

Jetpack Compose LazyList 未正确显示项目