24 - Reproducción, pausa, continuación y detención de un archivo de audio

Problema:

Confeccionar una aplicación que permita Iniciar un archivo mp3, detener, continuar, detener en forma definitiva y activación o no de la reproducción en forma circular.

Crear un archivo mp3 con el programa Audacity contando del 1 al 30.

Primero creamos un proyecto (Proyecto026) y definimos los 5 botones respectivos:

play mp3 android

Creamos la carpeta raw y almacenamos en la misma el archivo mp3 creado previamente:

play mp3 android

El código fuente en Kotlin es:

package com.tutorialesprogramacionya.proyecto026

import android.media.MediaPlayer
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

class MainActivity : AppCompatActivity() {
    private lateinit var  mp: MediaPlayer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mp = MediaPlayer.create(this, R.raw.numeros)
        var posicion = 0
        val boton1=findViewById<Button>(R.id.boton1)
        val boton2=findViewById<Button>(R.id.boton2)
        val boton3=findViewById<Button>(R.id.boton3)
        val boton4=findViewById<Button>(R.id.boton4)
        val boton5=findViewById<Button>(R.id.boton5)
        boton1.setOnClickListener {
            mp.start()
            if (boton5.text == "No reproducir en forma circular")
                mp.isLooping = false
            else
                mp.isLooping = true
        }

        boton2.setOnClickListener {
            if (mp.isPlaying()) {
                posicion = mp.getCurrentPosition()
                mp.pause()
            }
        }

        boton3.setOnClickListener {
            if (mp.isPlaying() == false) {
                mp.seekTo(posicion)
                mp.start()
            }
        }

        boton4.setOnClickListener {
            mp.pause()
            posicion = 0
            mp.seekTo(0)
        }

        boton5.setOnClickListener {
            if (boton5.text  == "No reproducir en forma circular")
                boton5.setText("Reproducir en forma circular")
            else
                boton5.setText("No reproducir en forma circular")
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        mp.release()
    }
}

Definimos una propiedad de la clase MediaPlayer y mediante la palabra clave lateinit indicamos que es una propiedad de inicio tardío (en el método onCreate se la carga):

    private lateinit var  mp: MediaPlayer

La variable mp debe definirse como propiedad debido que la accederemos en dos métodos (onCreate y onDestroy)

Primero en el método onCreate creamos el objeto de la clase MediaPlayer para administrar el archivo mp3, y definimos un entero donde se almacena la posición actual de reproducción en milisegundos (para poder continuarla en el futuro)
Para crear un objeto de la clase MediaPlayer llamando al método create (en este hacemos referencia al archivo que copiamos a la carpeta raw)

        mp = MediaPlayer.create(this, R.raw.numeros)
        var posicion = 0

En la lambda del botón 1 llamamos al método start del MediaPlayer con lo que comienza a reproducir el archivo de sonido, también fijamos si el sonido debe ejecutarse en forma circular dependiendo del texto que tenga el botón 5:

        boton1.setOnClickListener {
            mp.start()
            if (boton5.text == "No reproducir en forma circular")
                mp.isLooping = false
            else
                mp.isLooping = true
        }

El segundo botón verifica si el sonido está en ejecución, en caso afirmativo recuperamos la posición actual de reproducción y llamamos seguidamente al método pause:

        boton2.setOnClickListener {
            if (mp.isPlaying()) {
                posicion = mp.getCurrentPosition()
                mp.pause()
            }
        }

El tercer botón verifica que el objeto de la clase MediaPlayer está pausado y proceder a posicionar en que milisegundo continuar la reproducción:

        boton3.setOnClickListener {
            if (mp.isPlaying() == false) {
                mp.seekTo(posicion)
                mp.start()
            }
        }

El cuarto botón detiene la ejecución del mp3 e inicializa el atributo posicion con cero:

        boton4.setOnClickListener {
            mp.pause()
            posicion = 0
            mp.seekTo(0)
        }

Cuando se presiona el quinto botón cambia si la reproducción se efectúa en forma circular o no procediendo a extraer el texto del botón y según dicho valor almacenamos el valor opuesto:

        boton5.setOnClickListener {
            if (boton5.text  == "No reproducir en forma circular")
                boton5.setText("Reproducir en forma circular")
            else
                boton5.setText("No reproducir en forma circular")
        }

El método onDestroy se ejecuta cuando se cierra la aplicación y en nuestro caso llamamos al método release del la clase MediaPlayer para liberar los recursos:

    override fun onDestroy() {
        super.onDestroy()
        mp.release()
    }

Este proyecto lo puede descargar en un zip desde este enlace: proyecto026.zip