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.
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 androidO, 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..
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..
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;
Agregue las siguientes variables de instancia a la nueva Servicio
clase:
// reproductor multimedia MediaPlayer player privado; // lista de canciones privada ArrayListcanciones; // 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 ();
Es hora de agregar un método a la Servicio
clase para pasar la lista de canciones de la Actividad
:
Public Void setList (ArrayListtheSongs) 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.
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..
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.
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 ();
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..
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.
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.