Reproducción de música BG a través de actividades en Android

¡Hola! Primera vez para hacer una pregunta aquí en stackoverflow. ¡Emocionante! Jaja.

Estamos desarrollando un juego para Android y reproducimos algo de música de fondo para nuestra introducción (tenemos una actividad de introducción) pero queremos que continúe reproduciéndose en la próxima actividad, y quizás podamos detener o reproducir la música nuevamente desde cualquier lugar dentro del solicitud.

Lo que estamos haciendo en este momento es jugar el bgm usando MediaPlayer en nuestra Actividad de Introducción. Sin embargo, detenemos la música tan pronto como el usuario abandona esa Actividad. ¿Tenemos que usar algo como Servicios para esto? ¿O es MediaPlayer / SoundPool suficiente? Si alguien sabe la respuesta, con gusto agradeceremos que la comparta con nosotros. ¡Gracias!

En mi experiencia usando los servicios para esto no es una muy buena idea.

Música de fondo sin usar Servicios:

http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion

También puede crear un servicio que reproduzca música utilizando MediaPlayer como se muestra a continuación.

Intent svc=new Intent(this, BackgroundSoundService.class); startService(svc); //OR stopService(svc); 

 public class BackgroundSoundService extends Service { private static final String TAG = null; MediaPlayer player; public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { super.onCreate(); player = MediaPlayer.create(this, R.raw.idil); player.setLooping(true); // Set looping player.setVolume(100,100); } public int onStartCommand(Intent intent, int flags, int startId) { player.start(); return 1; } public void onStart(Intent intent, int startId) { // TODO } public IBinder onUnBind(Intent arg0) { // TODO Auto-generated method stub return null; } public void onStop() { } public void onPause() { } @Override public void onDestroy() { player.stop(); player.release(); } @Override public void onLowMemory() { } } 

Cree un SoundManager estático usando SoundPools o MediaPlayers.

Crea una bandera estática llamada keepMusicGoing.

Comience la música cuando se crea la primera actividad.

Al cambiar las actividades, configure keepMusicGoing en verdadero.

En el evento onStop de sus actividades, compruebe si keepMusicGoing es verdadero, si es así, deje la música activada y configure keepMusicGoing en false.

Si presionan el botón de inicio, la bandera de keepMusicGoing será falsa, por lo que la música se detendrá cuando la actividad pierda el foco.

Envíame un correo electrónico y puedo enviarte un par de SoundManagers que escribí uno usa MediaPlayers y el otro SoundPools

Chad

Si entiendo tu situación correctamente, me he enfrentado al mismo problema algunas veces. Estoy usando un hilo diferente para reproducir música en mis aplicaciones. Esta implementación pasa una referencia estática a un contexto que sé que estará vivo durante el tiempo en que se reproducirá la música.

 public class AudioPlayer extends Thread { private Context c; private Thread blinker; private File file; public AudioPlayer (Context c, File file) { this.c = c; this.file = file; } public void go () { blinker = this; if(!blinker.isAlive()) { blinker.start(); } } public void end () { Thread waiter = blinker; blinker = null; if (waiter != null) waiter.interrupt (); } public void run () { MediaPlayer ap = MediaPlayer.create(c, Uri.fromFile(file)); int duration = ap.getDuration(); long startTime = System.currentTimeMillis(); ap.start(); try { Thread thisThread = Thread.currentThread(); while (this.blinker == thisThread && System.currentTimeMillis() - startTime < duration) { Thread.sleep (500); // interval between checks (in ms) } ap.stop (); ap.release (); ap = null; } catch (InterruptedException e) { Log.d("AUDIO-PLAYER", "INTERRUPTED EXCEPTION"); ap.stop (); ap.release(); ap = null; } } } 

Puede intentar usar el AsyncPlayer, pero debe mantener una referencia a la clase para evitar que se reproduzca.

Puede crear un Uri en un recurso local usando Uri uri = Uri.parse("android.resource://com.stackoverlof.android/raw/ beep.mp3"); .

Espero que esto ayude.

Primero utilicé el método donde mantener una bandera “keepMusicPlaying” provista por Chad. Creo que es más elegante usar los métodos onStart y onStop de tus actividades.

Cree una clase propia “SoundManager” y llame a algunas clases onStart y onStop de todas sus actividades onStart y onStop (o use una clase de actividad base). Mantenga un registro de onStart y onStop con un startCounter (startCounter ++ en onstart y startCounter– in onstop). Debido a que el inicio de una nueva actividad se convoca antes de la parada de la actividad anterior, siempre se sabe si se llama a onStart por primera vez (startCounter == 1) o se inició desde otra de sus actividades (startCounter == 2). Lo mismo con el onStope (startCounter == 0 significa que la aplicación se cerró, startCounter == 1 significa que es solo la parada de una actividad anterior, pero hay una nueva).

De esta forma encapsulas todo en tu SoundManager en lugar de tener que llamar a algún método / indicador de keepMusicPlay en cada inicio de actividad dentro de tu aplicación.

  public void OnStart() { startCounter++; if (startCounter == 1) { //start music here } public void OnStop() { startCounter--; if (startCounter == 0) { // stop music here } } 

Mi biblioteca fue diseñada para hacer que la reproducción de medios de fondo sea lo más simple posible. Intente mirar la fuente, o simplemente use la biblioteca si lo desea.