2009-05-22 14 views
7

Estoy utilizando una instancia de MediaPlayer para transmitir archivos de audio desde una ubicación de Internet. El reproductor de audio está en una actividad separada. El usuario puede seleccionar de una lista de archivos de audio y venir a esta actividad para reproducir el audio.Android: compruebe si el audio se está reproduciendo actualmente y deténgalo

Ahora el usuario puede volver a la actividad anterior (con la lista) y seleccionar otro archivo de audio. En este caso, quiero detener cualquier otro audio que se esté reproduciendo y comenzar a reproducir el nuevo audio que se seleccionó.

¿Hay alguna manera de saber si un archivo de audio se está reproduciendo sin tener que aferrarme al objeto MediaPlayer?

Gracias.

Editar

he encontrado la manera de saber si un archivo de audio se reproduce. Podemos hacerlo utilizando un objeto de AudioManager y haciendo una llamada a isAudioPlaying(). Esto devolverá un verdadero si se está reproduciendo audio.

Ahora la otra pregunta, ¿cómo detengo un audio que se está reproduciendo actualmente? No tengo una instancia del objeto MediaPlayer que se creó para iniciar el audio (porque el usuario ya ha abandonado la actividad una vez y ha vuelto con un nuevo objeto de la actividad y una nueva instancia del MediaPlayer)

Respuesta

10

Deberá llamar al stop() en la instancia MediaPlayer. Para que esto funcione en su aplicación, ya sea que usted necesita:

  • llamada stop() dentro de la actividad de juego de audio (en onDestroy()), por ejemplo
  • Crear un Service para reproducir audio y comunicarse con él desde ambas actividades

el uso de un Service permitirá que su código continúe funcionando fuera del ciclo de vida de actividad, y es la única manera de conservar un objeto de MediaPlayer como que necesita en este caso.

O bien, puede crear una subclase personalizada de Application y almacenar allí el MediaPlayer, pero usar un Service se considera una práctica mejor.

+0

Gracias. ¿Sería mejor usar un servicio, una variable estática o una clase singleton? ¿Cuál sería la mejor opción de diseño? – lostInTransit

2

Aquí hay un código práctico para dormir hasta que el audio se realiza jugando:?

AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 
    while(manager.isMusicActive()) 
    { 
     Log.d("music", "music is active"); 
     try 
     { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) 
     { 
      Log.e("music", "interrupted waiting for music to stop"); 
     } 
     Log.d("music", "done playing music"); 
    } 
+1

esto no hace nada y alguien difícilmente lo hará útil – sandalone

2

@lostintransit "¿Sería mejor utilizar un servicio, una variable estática o una clase Singleton ¿Cuál sería la mejor opción de diseño ? "

Creo que un servicio es lo que quieres. El reproductor de medios incorporado y la aplicación de Pandora usan un servicio para garantizar que la música no esté vinculada al ciclo de vida de la actividad.

Si entiendo por qué utilizarías un singleton o estático, no creo que logre lo que quieres. El singleton/static solo se aplicará dentro de un único proceso en Linux. Si inicia su Actividad, luego ciérrela y luego vuelva a ejecutarla; se ejecutarán en diferentes procesos.

1

Pruebe esto ...

if (mp1 != null && mp1.isPlaying()) { 
       mp1.stop(); 
      } 

Dónde MP1 es la MediaPlayer

+1

Esto no funcionará si el objeto mp1 ha sido destruido en la aplicación cerrada. – sandalone

1

he encontrado manera de comprobar si flujo de audio (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION, etc) está ocupado actualmente utilizando la reflexión:

/** 
* Unhide android api: check is stream is active now (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION...), 
* uses reflection 
* @param audioStream 
* @return 
*/ 
public static boolean isStreamActive(int audioStream) { 
    Class<?> audioSystemClazz = null; 
    Boolean res = false; 
    try { 
     audioSystemClazz = Class.forName("android.media.AudioSystem"); 
     if (null != audioSystemClazz) { 
      // isStreamActive 
      Method method = audioSystemClazz.getDeclaredMethod("isStreamActive", new Class<?>[] { int.class, 
        int.class }); 
      if (null != method) { 
       res = (Boolean) method.invoke(null, audioStream, 0); 
      } 
     } 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 

    return res; 
} 
Cuestiones relacionadas