2010-01-19 22 views
30

¡Hola! Primera vez para hacer una pregunta aquí en stackoverflow. ¡Emocionante! Jaja.Reproducción de música BG a través de actividades en Android

Estamos desarrollando un juego de 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. de nuevo desde cualquier lugar dentro de la aplicación.

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!

+1

Acabo de encontrarme con el mismo problema y me preguntaba cómo saber cuándo detener la música. Si detiene el servicio en Destroy, lo detendrá entre subactividades. ¿Cómo sabe cuándo se cierra la última actividad del juego para detener la música? – Tom

Respuesta

13

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

+1

Ha pasado un tiempo desde que publiqué esta pregunta. Debería haberlo actualizado cuando encontramos la solución. El uso de un administrador de música estática en lugar de un Servicio parecía ser la mejor opción para esto. De hecho, el enlace que publicaste es exactamente del que lo hemos basado. Dios bendiga a Robert Green. – jhie

+0

¿Por qué los servicios no son una buena idea aquí? – codeulike

+6

Quizás me lo perdí cuando salté el código, pero parece que ejecuta el administrador de música en el hilo de la interfaz de usuario. Este no es un buen diseño. La música y otras operaciones (potencialmente) intensivas no deben realizarse en el hilo de la interfaz de usuario para evitar el cierre de la fuerza ANR. Esto está cubierto en una de las primeras Guías para Desarrolladores de Android: http://developer.android.com/guide/components/processes-and-threads.html#Threads Vea las otras respuestas que abordan el uso de hilos para obtener ejemplos correctos. – CatShoes

2

Si entiendo su situación correctamente, entonces me he enfrentado al mismo problema un par de 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; 
    } 
    } 
} 
1

Usted puede intentar usar la AsyncPlayer pero se debe mantener una referencia a la clase con el fin de detener la reproducción del sonido.

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

Espero que esto ayude.

9

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() { 

    } 
} 
4

Crear una SoundManager estática usando ya sea 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, luego 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.

correo electrónico y lo que usted puede enviar un par de SoundManagers que escribí uno utiliza MediaPlayers y los otros Soundpools

Chad

+1

Sí, así fue como lo hicimos. vladikoff publicó el enlace hacia donde obtuvimos la idea de usar un administrador estático para la música. – jhie

+0

hey chad puede enviarme esos ejemplos. Mi identificación de correo electrónico es [email protected] – Sourabh

+0

Estoy llegando a un problema con este enfoque. Mi aplicación admite rotaciones y cuando se gira el dispositivo, se llama aStop y también se llama cuando el usuario presiona home. Al girar, no quiero parar la música, pero cuando presiono el inicio, ¿no sé cómo diferenciar los eventos, alguna idea? – marchinram

0

En primer lugar he utilizado el método en el que para mantener una bandera "keepMusicPlaying" proporcionada por el 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 en Start y OnStop en todas sus actividades en Start 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 encapsula todo en su SoundManager en lugar de tener que llamar a algún método/indicador de keepMusic en cada inicio de actividad dentro de su aplicación.

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

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

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

Cuestiones relacionadas