Saltar la navegación

5.2.1. App de audio

El sistema Android promueve la división de las aplicaciones de reproducción de audio en dos módulos bien diferenciados.

  1. Por una parte, tendríamos el módulo de control, que mediante algún tipo de interfaz gráfica permite al usuario lanzar comandos como play, pause, siguiente pista, pista anterior, etcétera.
  2. Por otro lado, tendríamos un servicio corriendo en background, responsable de reproducir cada pista de audio según las acciones que puedan llegarle desde el módulo control.

De este modo, tendríamos una arquitectura clásica cliente-servidor. En este caso, la parte de control e interfaz gráfica sería el cliente, el servidor sería puramente el reproductor de audio.

Además, con el uso de algunas clases de Android podríamos conseguir que el sistema funcionase con más de un cliente.

Imaginemos que no solo deseamos controlar la pista actual que se está reproduciendo en el servidor mediante los controles de nuestra app, sino que, además, deseamos permitir que otra app instalada en un smartwatch pueda controlar el servidor. El sistema Android nos facilita el trabajo mediante el uso de las clases MediaBrowser y MediaBrowserService. Si no necesitamos que otras aplicaciones o módulos de terceros accedan a nuestro sistema para reproducir audio, podríamos utilizar un servicio mucho más sencillo, heredando directamente de la clase Service.

Ejemplo de reproductor

MainActivity.kt

package com.example.multimedia

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

class MainActivity : AppCompatActivity(),OnClickListener  {
    private var btnPlay: Button? = null
    private var btnPause: Button? = null
    private var btnStop: Button? = null
    private var mediaplayer: MediaPlayer? = null

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

        mediaplayer = MediaPlayer.create(this, R.raw.amor);

        //Obtenemos los tres botones de la interfaz
        btnPlay= findViewById(R.id.buttonPlay);
        btnStop= findViewById(R.id.buttonStop);
        btnPause= findViewById(R.id.buttonPause);

        //Y les asignamos el controlador de eventos
        btnPlay!!.setOnClickListener(this);
        btnStop!!.setOnClickListener(this);
        btnPause!!.setOnClickListener(this);
    }
    override fun onClick(v: View) {
        //Comprobamos el identificador del boton que ha llamado al evento para ver
        //cual de los botones es y ejecutar la acción correspondiente
        when (v.getId()) {
            R.id.buttonPlay ->                 //Iniciamos el audio
                mediaplayer!!.start()
            R.id.buttonPause ->                 //Pausamos el audio
                mediaplayer!!.pause()
            R.id.buttonStop ->                 //Paramos el audio y volvemos a inicializar
                try {
                    mediaplayer!!.stop()
                    mediaplayer!!.prepare()
                    mediaplayer!!.seekTo(0)
                } catch (e: IOException) {
                    e.printStackTrace()
                }
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        >

        <Button
            android:text="PLAY"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/buttonPlay"
            android:layout_alignParentBottom="true"
            android:layout_toLeftOf="@+id/buttonPause"
            android:layout_toStartOf="@+id/buttonPause"
            android:layout_marginBottom="20dp" />

        <Button
            android:text="PAUSE"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/buttonPause"
            android:layout_alignBaseline="@+id/buttonPlay"
            android:layout_alignBottom="@+id/buttonPlay"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="20dp"/>

        <Button
            android:text="STOP"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/buttonStop"
            android:layout_alignBaseline="@+id/buttonPause"
            android:layout_alignBottom="@+id/buttonPause"
            android:layout_toRightOf="@+id/buttonPause"
            android:layout_toEndOf="@+id/buttonPause"
            />

    </LinearLayout>
</RelativeLayout>

Creado con eXeLearning (Ventana nueva)