Код –
Код: Выделить всё
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
HomeView()
}
}
}
@Preview(showBackground = true)
@Composable
fun HomeView() {
var text by rememberSaveable { mutableStateOf("") }
var url by rememberSaveable { mutableStateOf("") }
PlayerXTheme {
Surface(modifier = Modifier.fillMaxSize()) {
Box(
modifier = Modifier
.fillMaxSize()
.padding(20.dp),
contentAlignment = Alignment.Center
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
SimpleOutlinedTextFieldSample(text) { text = it }
Button(
onClick = { url = text },
modifier = Modifier
.fillMaxWidth()
.padding(top = 16.dp)
) {
Text("Play Now")
}
if (url.isNotEmpty()) {
ExoPlayerView(url = url)
}
}
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SimpleOutlinedTextFieldSample(text: String, onTextChange: (String) -> Unit) {
OutlinedTextField(
value = text,
onValueChange = onTextChange,
label = { Text("HLS/M3U8 URL") },
modifier = Modifier
.fillMaxWidth()
.height(60.dp)
)
}
@Composable
fun ExoPlayerView(url: String) {
val context = LocalContext.current
val exoPlayer = remember {
ExoPlayer.Builder(context).build().apply {
val mediaItem = MediaItem.fromUri(url)
setMediaItem(mediaItem)
prepare()
playWhenReady = true
}
}
DisposableEffect(Unit) {
exoPlayer.addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
super.onIsPlayingChanged(isPlaying)
Log.d("ExoPlayerView", "IsPlaying: $isPlaying")
}
override fun onPlaybackStateChanged(state: Int) {
super.onPlaybackStateChanged(state)
Log.d("ExoPlayerView", "PlaybackState: $state")
}
})
onDispose {
exoPlayer.release()
}
}
AndroidView(
factory = {
PlayerView(context).apply {
player = exoPlayer
}
},
modifier = Modifier
.fillMaxWidth()
.height(200.dp)
)
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... -hls-video