Tema 8: Multimedia en Android
Objetivos de este tema
- Reproducir audio y video en una app Android usando
MediaPlayer
yExoPlayer
. - Capturar fotos y vídeos mediante la cámara del dispositivo.
- Acceder a la galería de imágenes del dispositivo.
- Usar del micrófono del disposivo.
- Utilizar sensores básicos del dispositivo como el acelerómetro y el sensor de luz.
- Integrar funcionalidades en una arquitectura moderna (MVVM + Clean Architecture) con Jetpack Compose.
8.1. Reproducción de audio y video
En Android hay diferentes maneras de reproducir contenido multimedia. Las más comunes son MediaPlayer
(nativa) y ExoPlayer
, esta última más moderna y recomendada para Compose.
8.1.1. MediaPlayer (API Nativa)
Esta clase está integrada en Android, por lo que no necesita dependencias externas, es sencilla de utilizar pero algo limitada y poco personalizable.
1val mediaPlayer = MediaPlayer.create(ctxt, R.raw.epic_cinematic)
2mediaPlayer.start() // Reproduce.
3mediaPlayer.pause() // Pausa la reproducción.
4mediaPlayer.stop() // Detiene.
5mediaPlayer.prepare() // Prepara el MediaPlayer para poder reproducirlo de nuevo.
6mediaPlayer.release() // // Libera recursos del MediaPlayer.
Nota
MediaPlayer
no está recomendado para reproducción en streaming o formatos complejos.
8.1.2. ExoPlayer
ExoPlayer
es una biblioteca de código abierto desarrollada por Google, ahora ya forma parte de Jetpack Media3. Es más potente y flexible que MediaPlayer
y se encuentra actualizada. Además de ser la recomendación actual.
Dependencias necesarias para incluir ExoPlayer
en el proyecto.
1// ExoPlayer
2implementation("androidx.media3:media3-exoplayer:1.8.0")
3implementation("androidx.media3:media3-ui:1.8.0")
4implementation("androidx.media3:media3-common:1.8.0")
El siguiente Composable utiliza un AndroidView
para incrustar el PlayerView
de ExoPlayer
.
1import androidx.compose.foundation.layout.fillMaxWidth
2import androidx.compose.runtime.Composable
3import androidx.compose.runtime.remember
4import androidx.compose.ui.Modifier
5import androidx.compose.ui.platform.LocalContext
6import androidx.compose.ui.viewinterop.AndroidView
7import androidx.media3.common.MediaItem
8import androidx.media3.exoplayer.ExoPlayer
9import androidx.media3.ui.PlayerView
10
11// VideoPlayer.kt
12@Composable
13fun VideoPlayer(videoUrl: String) {
14 val ctxt = LocalContext.current
15
16 // Se crea la instancia de ExoPlayer.
17 val exoPlayer = remember {
18 ExoPlayer.Builder(ctxt).build().apply {
19 val mediaItem = MediaItem.fromUri(videoUrl)
20 setMediaItem(mediaItem)
21 prepare()
22 playWhenReady = true
23 }
24 }
25
26 // Integración de la vista nativa de Android (PlayerView) en Compose.
27 AndroidView(
28 factory = { ctx ->
29 PlayerView(ctx).apply {
30 player = exoPlayer
31 useController = true // muestra controles
32 }
33 },
34 modifier = Modifier.fillMaxWidth(),
35 onRelease = { playerView ->
36 playerView.player?.release()
37 }
38 )
39}
La llamada desde la pantalla que muestre el vídeo será simplemente pasándole una URL.
1@Composable
2fun VideoScreen() {
3 VideoPlayer(videoUrl = "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
4}
Puedes obtener más vídeos de muestra en este repositorio.