26 - Reproducción de audio (archivo localizado en internet)

Ahora vamos a ver los pasos para reproducir un archivo almacenado en un servidor de internet.

Problema:

Disponer un botón con la etiqueta: "gato", luego cuando se presione reproducir el archivo de audio respectivo. El archivo de sonido se encuentra almacenado en https://www.tutorialesprogramacionya.com/recursos/gato.mp3

Creamos un proyecto (Proyecto028) y el primer paso es modificar el archivo AndroidManifest.xml donde autorizamos a la aplicación a acceder a recursos localizados en internet (debemos abrir este archivo y proceder a agregar el permiso de acceso a internet agregando la marca uses-permission respectivo):

play mp3 android localizados en internet

Creamos la interfaz de la aplicación con un botón:

play mp3 android localizados en internet

El código fuente es:

package com.tutorialesprogramacionya.proyecto028

import android.media.MediaPlayer
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import java.io.IOException

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val boton1=findViewById<Button>(R.id.boton1)
        boton1.setOnClickListener {
            val mp = MediaPlayer()
            try {
                mp.setDataSource("https://www.tutorialesprogramacionya.com/recursos/gato.mp3")
                mp.prepare()
                mp.start()
            } catch (e: IOException) {
                Toast.makeText(this, "No existe el archivo", Toast.LENGTH_LONG).show()
            }
        }
    }
}

Para recuperar un archivo mp3 de internet procedemos de la siguiente manera, primero creamos un objeto de la clase MediaPlayer:

            val mp = MediaPlayer()

Luego llamamos al método setDataSource indicando la dirección de internet donde se almacena el archivo mp3:

                mp.setDataSource("https://www.tutorialesprogramacionya.com/recursos/gato.mp3")

Llamamos al método prepare y seguidamente llamamos a start:

                mp.prepare()
                mp.start()

Todo esto lo hacemos en un bloque try/catch para capturar excepciones de tipo IOException.

Esta primera aproximación para ejecutar un mp3 localizado en internet bloquea la aplicación hasta que se carga por completo el archivo, es decir queda ejecutándose el método mp.prepare() hasta que finaliza la recuperación en forma completa.

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

Problema:

Confeccionar otra aplicación similar a la anterior pero que no se congele la interfaz de la aplicación mientras se carga el mp3. Mostrar un mensaje que el archivo se está cargando.

Desarrollamos un nuevo proyecto (Proyecto029), asignamos el permiso de acceder a internet en el archivo AndroidManifest.xml y creamos una interfaz similar al problema anterior.

El código fuente es:

package com.tutorialesprogramacionya.proyecto029

import android.media.MediaPlayer
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import java.io.IOException

class MainActivity : AppCompatActivity(), MediaPlayer.OnPreparedListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val boton1=findViewById<Button>(R.id.boton1)
        boton1.setOnClickListener {
            val mp = MediaPlayer()
            mp.setOnPreparedListener(this)
            try {
                mp.setDataSource("https://www.tutorialesprogramacionya.com/recursos/gato.mp3")
                mp.prepareAsync()
            } catch (e: IOException) {
            }
            Toast.makeText(this, "Espere un momento mientras se carga el mp3", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onPrepared(p0: MediaPlayer?) {
        p0?.start();
    }
}

Para poder capturar el evento que el archivo se terminó de recuperar debemos implementar la interface MediaPlayer.OnPreparedListener:

class MainActivity : AppCompatActivity(), MediaPlayer.OnPreparedListener {

Con esto decimos que nuestra clase implementará el método onPrepared donde iniciamos la ejecución del mp3:

    override fun onPrepared(p0: MediaPlayer?) {
        p0?.start();
    }

En el evento click del botón creamos el objeto de la clase MediaPlayer, le pasamos al método setOnPreparedListener la dirección del objeto que capturará el evento de que el recurso está completo. Luego llamamos a los métodos setDataSource y prepareAsync para inicializar la carga del mp3. Finalmente mostramos un mensaje para informar al usuario que el archivo se está descargando:

        boton1.setOnClickListener {
            val mp = MediaPlayer()
            mp.setOnPreparedListener(this)
            try {
                mp.setDataSource("https://www.tutorialesprogramacionya.com/recursos/gato.mp3")
                mp.prepareAsync()
            } catch (e: IOException) {
            }
            Toast.makeText(this, "Espere un momento mientras se carga el mp3", Toast.LENGTH_SHORT).show()
        }

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