怠慢プログラマーの備忘録

怠慢でナマケモノなプログラマーの備忘録です。

Jetpack ComposeでExoPlayerを使用する(備忘録)

build.gradle(:app)
// Exo Player
    implementation "com.google.android.exoplayer:exoplayer:2.18.0"
Composable
    @Composable
    private fun VideoDetailComposeView() {
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .clickable(false) {})
        {
            Box(
                modifier = Modifier.height(500.dp)
            ) {                 
                val context = LocalContext.current
                val exoPlayer = remember(context) {
                    ExoPlayer.Builder(context).build().apply {
                        val videoSource: MediaSource = ProgressiveMediaSource
                            .Factory(DefaultDataSource.Factory(context))
                            .createMediaSource(MediaItem.fromUri(args.entity.mediaUrl))
                        this.setMediaSource(videoSource)
                        this.prepare()
                    }
                }
                exoPlayer.addListener(
                    object : Player.Listener {
                        override fun onPlayerError(error: PlaybackException) {
                            super.onPlayerError(error)
                            Log.d("ERROR:", error.message.toString())
                        }
                    }
                )

                DisposableEffect(
                    AndroidView(
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(476.dp),
                        factory = {
                            StyledPlayerView(context).apply {
                                player = exoPlayer
                            }
                        })
                ) {
                    onDispose { exoPlayer.release() }
                }
            }     
        }
    }

PlayerViewがExoPlayerの最新バージョンではDeprecatedになっているためStyledPlayerViewを使用すると画像の通りコンパネ部分も変更されている。

またGridやListのItemとしてExoPlayerを使用したいときClickableを無効にしたい場合(再生ボタンなどのコンパネも非表示)はcontrollerAutoShow = falseisClickable = falseをExoPlayerに設定する。 またGridなどにおさめるためにサイズを変更したい場合等はresizeMode = AspectRatioFrameLayout.xxxを使用。

                DisposableEffect(
                    AndroidView(
                        modifier = Modifier
                            .height(heightSize.dp)
                            .clip(RoundedCornerShape(4.dp)),
                        factory = {
                            StyledPlayerView(context).apply {
                                controllerAutoShow = false
                                player = exoPlayer
                                resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL
                                isClickable = false
                                LinearLayout.LayoutParams(
                                    ViewGroup.LayoutParams
                                        .WRAP_CONTENT,
                                    ViewGroup.LayoutParams
                                        .WRAP_CONTENT
                                )
                            }
                        }
                    )
                ) {
                    onDispose { exoPlayer.release() }
                }