You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose集成ExoPlayer无法交互,疑似焦点问题求解决

解决Jetpack Compose集成ExoPlayer无法交互的问题

针对你遇到的Compose早期版本集成ExoPlayer后按键无响应的问题,核心原因是早期Compose的AndroidView焦点传递机制不完善,加上当前焦点处理方式拦截了PlayerView内部控件的焦点获取,以下是可行的解决思路和修改方案:

1. 修正DisposableEffect的使用方式

你当前把AndroidView作为DisposableEffect的key是错误的,应该以exoPlayer作为key,确保播放器在组件销毁时正确释放,同时把AndroidView单独作为Compose节点渲染。

2. 让PlayerView自行处理焦点

去掉Compose Modifier上的focusable和focusRequester,这些设置会拦截焦点,导致PlayerView内部的控制按钮无法获取焦点。转而在PlayerView初始化时直接配置焦点属性,并请求它获取焦点。

3. 手动转发按键事件(针对早期Compose版本)

在alpha06版本中,AndroidView的按键事件传递存在bug,需要通过Compose的按键回调手动把事件转发给PlayerView。

修改后的完整代码

@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun VideoPlayer(mediaItem: VideoApi.MediaItem) {
    val context = LocalContext.current
    val exoPlayer = remember {
        ExoPlayer.Builder(context)
            .build()
            .apply {
                addMediaItem(
                    MediaItem.Builder()
                        .setUri(mediaItem.hlsCaptions)
                        .setMimeType(MimeTypes.APPLICATION_M3U8)
                        .build()
                )
                prepare()
                playWhenReady = true
            }
    }

    // 用exoPlayer作为DisposableEffect的key,确保播放器正确释放
    DisposableEffect(exoPlayer) {
        onDispose {
            exoPlayer.release()
        }
    }

    var playerView by remember { mutableStateOf<StyledPlayerView?>(null) }

    AndroidView(
        modifier = Modifier
            .onKeyEvent { event ->
                // 手动转发按键事件给PlayerView
                playerView?.dispatchKeyEvent(event.nativeKeyEvent) ?: false
            },
        factory = {
            StyledPlayerView(context).apply {
                player = exoPlayer
                useController = true
                controllerAutoShow = true
                setShowBuffering(StyledPlayerView.SHOW_BUFFERING_ALWAYS)
                // 让PlayerView自身可获取焦点
                isFocusable = true
                isFocusableInTouchMode = true
                // 请求PlayerView获取焦点
                requestFocus()
                playerView = this
            }
        }
    )
}

额外建议:升级Compose版本

1.0.0-alpha06是非常早期的预览版本,焦点系统、AndroidView交互等都存在大量未修复的bug。如果项目允许,建议直接升级到Compose稳定版(比如1.4+),很多这类兼容性问题会自动消失。

内容的提问来源于stack exchange,提问作者Tim Schmidt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:00:37