Crear un reproductor de música en Android Reproducción de canciones

En esta serie, estamos creando un reproductor de música en Android usando el Reproductor multimedia y MediaController clases En la primera parte, creamos la aplicación y preparamos la interfaz de usuario para la reproducción. Presentamos la lista de canciones en el dispositivo del usuario y especificamos un método para ejecutar cuando el usuario realiza una selección. En esta parte de la serie, implementaremos un Servicio clase para ejecutar la reproducción de música continuamente, incluso cuando el usuario no está interactuando directamente con la aplicación.

Buscando una solución rápida?

Esta serie lo lleva a través del proceso completo de creación de un reproductor de música Android desde cero, pero otra opción es usar una de las plantillas de aplicación de reproductor de música en Envato Market, como el Reproductor de música Android, que permite a los usuarios explorar y reproducir música por álbumes. Artistas, canciones, listas de reproducción, carpetas y artistas de álbumes..

Reproductor de musica android

O, para obtener ayuda más personalizada, puede contratar a un desarrollador de aplicaciones móviles en Envato Studio. De esa manera, puede obtener ayuda confiable y asequible en cualquier aspecto del trabajo de desarrollo con el que no se sienta cómodo, y concentrar su energía y tiempo en las áreas en las que es más fuerte..

Introducción

Necesitaremos la aplicación para enlazar con la música. Servicio para interactuar con la reproducción, por lo que aprenderá algunos de los aspectos básicos de la reproducción Servicio Ciclo de vida en este tutorial si no los has explorado antes. Aquí hay una vista previa del resultado final en el que estamos trabajando:


En la última entrega de esta serie, agregaremos el control del usuario sobre la reproducción y también nos aseguraremos de que la aplicación continúe funcionando en varios estados de la aplicación. Más adelante, seguiremos la serie con mejoras adicionales que tal vez desee agregar, como control de enfoque de audio, reproducción de video y transmisión de medios, y formas alternativas de presentar los archivos de medios..

1. Crear un servicio

Paso 1

Agrega una nueva clase a tu aplicación, dándole un nombre Servicio de musica u otro nombre de su elección. Asegúrese de que coincida con el nombre que aparece en el manifiesto. Al crear la clase en Eclipse, elija android.app.Service como su superclase. Eclipse debe introducir un esquema:

clase pública MusicService extiende el servicio @Override public IBinder onBind (Intención arg0) // TODO Autodetenido método de retorno de apéndice nulo; 

Extienda la línea de apertura de la declaración de clase para implementar algunas interfaces que usaremos para la reproducción de música:

la clase pública MusicService amplía los implementos de servicio MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener 

Eclipse mostrará un error sobre el nombre de la clase. Coloca el cursor sobre el error y elige Añadir métodos no implementados. Añadiremos código a los métodos en unos instantes. Las interfaces que estamos implementando ayudarán al proceso de interacción con el Reproductor multimedia clase.

Su clase también necesitará las siguientes importaciones adicionales:

import java.util.ArrayList; import android.content.ContentUris; importar android.media.AudioManager; importar android.media.MediaPlayer; importar android.net.Uri; import android.os.Binder; importar android.os.PowerManager; import android.util.Log;

Paso 2

Agregue las siguientes variables de instancia a la nueva Servicio clase:

// reproductor multimedia MediaPlayer player privado; // lista de canciones privada ArrayList canciones; // posición actual private int songPosn;

Pasaremos la lista de canciones a la Servicio clase, jugando desde ella usando el Reproductor multimedia clase y mantener un seguimiento de la posición de la canción actual utilizando el canciónPosn Instancia variable. Ahora, implementa el onCreate método para el Servicio:

public void onCreate () // crea el servicio

Dentro onCreate, llamar al método de superclase, instanciar la posición y Reproductor multimedia variables de instancia:

// crear el servicio super.onCreate (); // inicializar posición songPosn = 0; // crea jugador jugador = nuevo MediaPlayer ();

A continuación, vamos a agregar un método para inicializar el Reproductor multimedia clase, despues de la onCreate método:

public void initMusicPlayer () // establecer propiedades del jugador

Dentro de este método, configuramos el reproductor de música configurando algunas de sus propiedades como se muestra a continuación:

player.setWakeMode (getApplicationContext (), PowerManager.PARTIAL_WAKE_LOCK); player.setAudioStreamType (AudioManager.STREAM_MUSIC);

El bloqueo de activación permitirá que la reproducción continúe cuando el dispositivo esté inactivo y configuramos el tipo de transmisión en música. Establezca la clase como oyente para (1) cuando el Reproductor multimedia la instancia está preparada, (2) cuando una canción ha finalizado la reproducción, y cuando (3) se produce un error:

player.setOnPreparedListener (this); player.setOnCompletionListener (this); player.setOnErrorListener (this);

Tenga en cuenta que estos corresponden a las interfaces que implementamos. Estaremos agregando código a la enPreparado, en la terminación, y en error Métodos para responder a estos eventos. De nuevo en onCreate, invocar initMusicPlayer:

initMusicPlayer ();

Paso 3

Es hora de agregar un método a la Servicio clase para pasar la lista de canciones de la Actividad:

Public Void setList (ArrayList theSongs) canciones = theSongs; 

Llamaremos a este método más adelante en el tutorial. Esto formará parte de la interacción entre el Actividad y Servicio Clases, para las cuales también necesitamos un Aglutinante ejemplo. Agregue el siguiente fragmento de código al Servicio clase despues de setList método:

la clase pública MusicBinder extiende Binder MusicService getService () return MusicService.this; 

También accederemos a esto desde la Actividad clase.

2. Inicia el servicio

Paso 1

De vuelta en la aplicación principal. Actividad clase, deberá agregar las siguientes importaciones adicionales:

importar android.os.IBinder; importar android.content.ComponentName; importar android.content.Context; import android.content.Intent; importar android.content.ServiceConnection; importar android.view.MenuItem; importar android.view.View;

Y también deberás declarar tres nuevas variables de instancia:

MusicService MusicSrv privado; intento privado playentent; musical booleano privadoBound = falso;

Vamos a tocar la música en el Servicio clase, pero controlarlo desde el Actividad clase, donde opera la interfaz de usuario de la aplicación. Para lograr esto, tendremos que unirnos a la Servicio clase. Las variables de instancia anteriores representan la Servicio clase y Intención, así como una bandera para realizar un seguimiento de si el Actividad clase está vinculada a la Servicio clase o no Agregue lo siguiente a su Actividad clase, despues de la onCreate método:

// conectarse al servicio privado ServiceConnection musicConnection = new ServiceConnection () @Override public void onServiceConnected (nombre de ComponentName, servicio de IBinder) MusicBinder binder = (MusicBinder); // obtener servicio musicSrv = binder.getService (); // pass list musicSrv.setList (songList); musicBound = true;  @Override public void onServiceDisconnected (nombreComponentName) musicBound = false; ;

Los métodos de devolución de llamada informarán a la clase cuando el Actividad instancia se ha conectado con éxito a la Servicio ejemplo. Cuando eso sucede, obtenemos una referencia a la Servicio instancia para que el Actividad Puede interactuar con él. Comienza llamando al método para pasar la lista de canciones. Establecemos la bandera booleana para realizar un seguimiento del estado de enlace. Necesitará importar el Aglutinante clase que agregamos a la Servicio clase en la parte superior de tu Actividad clase:

import com.example.musicplayer.MusicService.MusicBinder;

No olvide modificar el paquete y los nombres de clase para que se ajusten a los suyos si es necesario..

Paso 2

Queremos empezar el Servicio instancia cuando el Actividad la instancia comienza, así que anula el onStart método:

@Override protected void onStart () super.onStart (); if (playIntent == null) playIntent = new Intent (this, MusicService.class); bindService (playIntent, musicConnection, Context.BIND_AUTO_CREATE); startService (playIntent); 

Cuando el Actividad comienza la instancia, creamos el Intención objetar si aún no existe, vincularlo e iniciarlo. Altere el código si elige un nombre diferente para el Servicio clase. Observe que utilizamos el objeto de conexión que creamos para que cuando la conexión al límite Servicio Se hace caso, pasamos la lista de canciones. También podremos interactuar con el Servicio instancia para controlar la reproducción más tarde.

Volver a su Servicio Clase para completar este proceso de enlace. Añadir una variable de instancia que representa el interior Aglutinante clase que agregamos

final privado IBinder musicBind = nuevo MusicBinder ();

Ahora enmiende el en enlace Método para devolver este objeto:

@Override public IBinder onBind (Intención de intención) return musicBind; 

Añade el onUnbind método para liberar recursos cuando el Servicio la instancia no está unida:

@Override public boolean onUnbind (Intención de intención) player.stop (); jugador.release (); falso retorno; 

Esto se ejecutará cuando el usuario salga de la aplicación, momento en el que detendremos el servicio.

3. Comienza la reproducción

Paso 1

Ahora vamos a configurar la aplicación para reproducir una pista. En tus Servicio clase, agregue el siguiente método:

public void playSong () // reproducir una canción

Dentro del método, comience por reiniciar el Reproductor multimedia ya que también usaremos este código cuando el usuario esté reproduciendo las siguientes canciones:

player.reset ();

A continuación, obtenga la canción de la lista, extraiga la ID para ella usando su Canción objeto, y modelo esto como un URI:

// obtener la canción Song playSong = songs.get (songPosn); // obtener id long currSong = playSong.getID (); // establece uri Uri trackUri = ContentUris.withAppendedId (android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, currSong);

Ahora podemos intentar configurar este URI como la fuente de datos para el Reproductor multimedia instancia, pero se puede lanzar una excepción si aparece un error, así que usamos un trata de atraparlo bloquear:

intente player.setDataSource (getApplicationContext (), trackUri);  catch (Exception e) Log.e ("MUSIC SERVICE", "Error al establecer la fuente de datos", e); 

Después de la captura bloque, completa el playSong método llamando al método asíncrono de la Reproductor multimedia para prepararlo:

player.prepareAsync ();

Paso 2

Cuando el Reproductor multimedia está preparado, el enPreparado Se ejecutará el método. Eclipse debería haberlo insertado en tu Servicio clase. Dentro de este método, inicie la reproducción:

@ Anular el vacío público enPreparado (MediaPlayer mp) // iniciar la reproducción mp.start (); 

Para que el usuario seleccione canciones, también necesitamos un método en el Servicio Clase para configurar la canción actual. Agrégalo ahora:

public void setSong (int songIndex) songPosn = songIndex; 

Llamaremos a esto cuando el usuario elija una canción de la lista..

Paso 3

Recuerda que hemos añadido un al hacer clic atribuir al diseño para cada elemento en la lista de canciones. Añadir ese método a la principal Actividad clase:

public void songPicked (vista de vista) musicSrv.setSong (Integer.parseInt (view.getTag (). toString ())); musicSrv.playSong (); 

Establecimos la posición de la canción como la etiqueta para cada elemento en la vista de lista cuando definimos el Adaptador clase. Lo recuperamos aquí y lo pasamos a la Servicio instancia antes de llamar al método para iniciar la reproducción.

Antes de ejecutar su aplicación, implemente el fin Botón que hemos añadido al menú principal. En tu principal Actividad clase, agregue el método para responder a la selección del elemento del menú:

@Override public boolean onOptionsItemSelected (elemento MenuItem) // elemento del menú seleccionado

Dentro del método, agregue una declaración de cambio para las acciones:

switch (item.getItemId ()) case R.id.action_shuffle: // shuffle break; case R.id.action_end: stopService (playIntent); musicSrv = null; System.exit (0); descanso;  return super.onOptionsItemSelected (item);

Implementaremos la función shuffle en el siguiente tutorial. Para el fin botón, paramos el Servicio Instalar y salir de la aplicación. Al presionar el botón Atrás no se cerrará la aplicación, ya que asumiremos que el usuario desea que la reproducción continúe a menos que seleccione la opción fin botón. Utilice el mismo proceso si se destruye la aplicación, anulando la actividad onDestroy método:

@ Overcride notificado notid onDestroy () stopService (playIntent); musicSrv = null; super.onDestroy (); 

Cuando ejecute la aplicación en este punto, podrá reproducir canciones seleccionándolas de la lista y también puede salir de la aplicación usando la fin botón.

Conclusión

Ahora hemos implementado la reproducción básica de pistas de música seleccionadas de la lista de archivos de música del usuario. En la parte final de esta serie, agregaremos un controlador de medios a través del cual el usuario podrá controlar la reproducción. Agregaremos una notificación para permitir que el usuario vuelva a la aplicación después de navegar fuera de ella y realizaremos algunas tareas de limpieza para que la aplicación pueda hacer frente a una variedad de acciones del usuario.