Jetpack Compose:无法使用Youtube API

4

我已经研究了一天,但没有找到任何有关在Jetpack Compose中使用YouTube API的参考资料。是否可以在Jetpack Compose中使用它,或者是否有其他方法来在Jetpack Compose中播放YouTube视频?请帮助我。


1
你尝试了什么,遇到了什么问题?例如,你是否尝试使用 AndroidView(https://developer.android.com/jetpack/compose/interop/interop-apis#views-in-compose)? - CommonsWare
我找到了一个关于如何使用Jetpack Compose播放视频的教程。我认为你可以用它。https://itnext.io/playing-a-video-with-jetpack-compose-10a453ff956 - Sergio Pardo
@CommonsWare 我已经尝试了,但是它抛出了一个错误,说“只有继承YouTubeBaseActivity的Activity可以作为上下文创建YouTubePlayerView。” - Tanjim ahmed
你的活动是否扩展了 YouTubeBaseActivity - CommonsWare
如果我扩展Youtubebase活动,我就不能使用compose。在扩展Youtubebase Activity之后,setContent函数无法工作。 - Tanjim ahmed
1
@Tanjimahmed,请在您的问题中添加所有信息,因为按照目前的阅读,没有足够的信息进行调试、研究或提供任何帮助。 - Marco Aurelio Fernandez Reyes
1个回答

3

确实,这是一个棘手的问题。

你不能使用YouTubeBaseActivity,也就是说,你不能使用YouTubePlayerView。该视图仅适用于一种活动类型,并且不适用于你的片段/组合体架构。

你不能使用YouTubePlayerFragment,因为它的父类来自android.app包,而该包已被弃用,所以你将无法在你的花哨组合体活动中获取旧的fragmentManager。

你可以并且必须使用YouTubePlayerSupportFragment与compose活动片段管理器(它是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 = { }
    )
}

add 方法中,它会抛出一个异常:类型不匹配:推断类型是YouTubePlayerSupportFragment,但期望的是Fragment! - Dewerro
@Dewerro 这不是异常,而是编译错误。在使用包/导入时,“嘿嘿,小心一点”。您需要从您的上下文中支持片段管理器,并且它必须是 androidx.fragment.app.FragmentManager 的 fm 导入,而不是您明显正在使用的 android.app.FragmentManager。 - Ivan Mitsura
问题不在支持片段管理器中。这是因为YouTubePlayerSupportFragment扩展自android.support.v4.app.Fragment,而不是android.app.Fragment。但是add()需要android.app.Fragment。 - Dewerro
我决定使用https://github.com/PierfrancescoSoffritti/android-youtube-player,因为它比旧的YouTube API更易于使用。 - Dewerro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接