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 = false
とisClickable = 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() } }