我已经研究了一天,但没有找到任何有关在Jetpack Compose中使用YouTube API的参考资料。是否可以在Jetpack Compose中使用它,或者是否有其他方法来在Jetpack Compose中播放YouTube视频?请帮助我。
我已经研究了一天,但没有找到任何有关在Jetpack Compose中使用YouTube API的参考资料。是否可以在Jetpack Compose中使用它,或者是否有其他方法来在Jetpack Compose中播放YouTube视频?请帮助我。
确实,这是一个棘手的问题。
你不能使用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!
。 - Dewerroadd()
需要android.app.Fragment。 - Dewerro
AndroidView
(https://developer.android.com/jetpack/compose/interop/interop-apis#views-in-compose)? - CommonsWareYouTubeBaseActivity
? - CommonsWare