【问题标题】:Jetpack compose - Exoplayer full screenJetpack compose - Exoplayer 全屏
【发布时间】:2022-06-29 02:08:40
【问题描述】:

我正在尝试在我使用 jetpack compose 制作的 Android 应用中播放视频。要使用 ExoPlayer 流式传输我,但我真的不明白如何实现全屏按钮,有什么建议吗?

@Composable
private fun VideoPlayer() {
    val videoURI = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
    val httpDataSourceFactory: HttpDataSource.Factory =
        DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(false)
    val dataSourceFactory: DataSource.Factory = DataSource.Factory {
        val dataSource = httpDataSourceFactory.createDataSource()
        dataSource.setRequestProperty(
            "cookie", "cookieValue"
        )
        dataSource.setRequestProperty("Range", "1-10000")
        dataSource
    }

    val mContext = LocalContext.current
    // Initializing ExoPLayer
    val mExoPlayer = remember(mContext) {
        ExoPlayer.Builder(mContext)
            .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory)).build().apply {

                val mediaItem = MediaItem.Builder()
                    .setUri(Uri.parse(videoURI))
                    .build()
                setMediaItem(mediaItem)
                playWhenReady = true
                prepare()

            }

    }

    DisposableEffect(

        // Implementing ExoPlayer
        AndroidView(factory = { context ->
            StyledPlayerView(context).apply {
                player = mExoPlayer
            }
        })
    ) {
        onDispose {
            mExoPlayer.release()
        }
    }
}

编辑 添加 setControllerOnFullScreenModeChangedListener 道具 exo 将显示全屏内置按钮,我解决了在此列表器中调用全屏功能的问题

            AndroidView(
                factory = { context ->
                    StyledPlayerView(context).apply {
                        player = mExoPlayer
                        setControllerOnFullScreenModeChangedListener {
                        if(it)
                            //fullscreen
                        else
                            //minimize
                    }                    }
                })

【问题讨论】:

    标签: android-jetpack-compose exoplayer


    【解决方案1】:

    要让应用全屏显示,有

    with(WindowCompat.getInsetsController(window, window.decorView)) {
        systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        hide(WindowInsetsCompat.Type.systemBars())
    }
    

    我为 Kotlin 量身定制的,所以您只需将其连接到 ButtononClick 即可。

    Button(
      onclick = { /*Paste above Code here*/ }
    ){
     Text("Go full-screen") // Whatever here, per your use-case
    }
    

    如果由于某种原因这不起作用,或者无法通过onClick 访问某些内容,只需创建一个LaunchedEffect 并使用MutableState<Boolean> 作为键并更改键以触发反应。没有必要,很可能是因为onClick 应该可以正常工作。

    【讨论】:

    • 嗯是的,但是这样按钮会放在播放器外面,我不能放在里面吗?
    • 请分享一些示例代码并参考您希望放置按钮的位置。同样,如果您不希望它与特定的 Composable 绑定,请在声明性范式中使用状态管理之父,即 [state-hoisting](https:developer.android.com/codelabs/jetpack-compose-状态#8)。简而言之,创建一个 ViewModel 并在其中存储一个布尔值 MutableState<T> ,并使其成为整个应用程序知道是否要使用全屏模式的唯一事实来源。
    • 如果您不明白,请告诉我。不过这很简单。您可以使用上面的`LaunchedEffect 方法将其绑定到您想要的任何代码块,它会触发反应。
    • 另外,为什么按钮还要放在exoplayer外面呢?我认为这些都是可组合的,因此可以使用像Box 这样简单的东西轻松重叠
    • 是的,你是对的,里面有一个盒子。无论如何,我发现使用 exo 的默认全屏按钮是不可能的,将道具 setControllerOnFullScreenModeChangedListener 添加到 StyledPlayerView
    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2022-11-10
    • 2018-07-03
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2023-03-07
    • 2022-11-07
    相关资源
    最近更新 更多