寻找 Jetpack Compose YouTube 视频播放器包装依赖项

Tob*_*aut 6 android kotlin youtubeplayer android-jetpack-compose

介绍

我是 Jetpack Compose 的新手,对我来说,在第一次尝试时理解或让所有内容都正确并不容易。

这就是为什么我喜欢查看其他人的开源工作以更好地理解该主题。

问题

我当前的问题是我必须将 YouTube 视频嵌入到我的应用程序中。起初,我以为我使用的是嵌入式 Web 视图,但是嘿,我是本机应用程序开发人员,让我们以本机方式来做吧!

但我跌倒了很多

  1. 我们作为开发人员必须使用 Google 的本地 *.jar 文件来嵌入视频播放器,这是真的吗?
  2. 确实没有官方的 Jetpack Compose 组件吗?
  3. 我们那里确实没有提供此类功能的依赖项吗?
  4. 是的,我在问之前就搜索过

这就是为什么如果你们中有人能指出正确的方向,让我的小型自学应用程序取得任何进展,那就太棒了。

小智 14

最简单的方法是首先在 gradle 文件中添加这一行

"implementation" ("com.pierfrancescosoffritti.androidyoutubeplayer:core:11.1.0")
Run Code Online (Sandbox Code Playgroud)
@Composable
fun YoutubeScreen(
    videoId: String,
    modifier: Modifier
) {
    val ctx = LocalContext.current
    AndroidView(factory = {
        var view = YouTubePlayerView(it)
        val fragment = view.addYouTubePlayerListener(
            object : AbstractYouTubePlayerListener() {
                override fun onReady(youTubePlayer: YouTubePlayer) {
                    super.onReady(youTubePlayer)
                    youTubePlayer.loadVideo(videoId, 0f)
                }
            }
        )
        view
    })
}
Run Code Online (Sandbox Code Playgroud)


ngl*_*ber 8

答案如下:

  1. 正如官方页面所说,是的,你必须下载一个 JAR。

  2. 是的,但没有必要。您可以使用AndroidView可组合函数来包装YouTubePlayerFragment并播放视频。

    但在这里你需要做一个小修改,因为YouTubePlayerFragment不从 延伸androidx.fragment.app.Fragment。因此,您将需要以下内容:

    2.1 创建一个YoutubePlayerFragment使用androidx. 您可以复制此要点

    2.2 然后,您可以在您的可组合项中使用它...

@Composable
fun YoutubeScreen() {
    val ctx = LocalContext.current
    AndroidView(factory = {
        val fm = (ctx as AppCompatActivity).supportFragmentManager
        val view = FragmentContainerView(it).apply {
            id = R.id.fragment_container_view_tag
        }
        val fragment = YouTubePlayerSupportFragmentXKt().apply {
            initialize("YoutubeApiKey",
                object : YouTubePlayer.OnInitializedListener {
                    override fun onInitializationFailure(
                        provider: YouTubePlayer.Provider,
                        result: YouTubeInitializationResult
                    ) {
                        Toast.makeText(
                            context,
                            "Error playing video",
                            Toast.LENGTH_SHORT
                        ).show()
                    }

                    override fun onInitializationSuccess(
                        provider: YouTubePlayer.Provider,
                        player: YouTubePlayer,
                        wasRestored: Boolean
                    ) {
                        if (!wasRestored) {
                            player.cueVideo("YoutubeVideoId")
                        }
                    }
                })
        }
        fm.commit {
            setReorderingAllowed(true)
            add(R.id.fragment_container_view_tag, fragment)
        }
        view
    })
}
Run Code Online (Sandbox Code Playgroud)

对于commit上面的函数,您将需要以下依赖项:

implementation "androidx.fragment:fragment-ktx:$fragment_ktx_version"
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您的AndroidManifest.xml

implementation "androidx.fragment:fragment-ktx:$fragment_ktx_version"
Run Code Online (Sandbox Code Playgroud)

我测试了上面的代码并且它有效,但也许您需要更多的工作来处理方向更改。

  1. 据我所知,我在#1中提到过,不,没有。

  2. 这不是一个问题:)