Tema 8: Multimedia en Android

Objetivos de este tema

  • Reproducir audio y video en una app Android usando MediaPlayer y ExoPlayer.
  • 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.

Código completo

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}

Código completo

Puedes obtener más vídeos de muestra en este repositorio.

8.2. Captura de imágenes y vídeo

8.3. Galería de imágenes

8.4. Uso del micrófono

8.5. Sensores básicos

Fuentes