Reproductor multimedia de Android juega en el fondo, pero no se detiene cuando se mata la aplicación

Soy nuevo en Android, así que tengo un problema. En Android, quiero reproducir música de fondo tan pronto como empiece mi reproductor de música y que continúe aunque cambie la actividad de uno a otro. He intentado este código:

MediaPlayer music = MediaPlayer.create(MainActivity.this, R.drawable.bgscore); music.start(); 

Sin embargo, el sonido debe detenerse cuando el usuario cierra la aplicación y no. ¿Cómo puedo conseguir esto?

10 Solutions collect form web for “Reproductor multimedia de Android juega en el fondo, pero no se detiene cuando se mata la aplicación”

Crear una clase separada para manejar varias condiciones

 import android.content.Context; import android.media.MediaPlayer; import android.util.Log; public class MusicManager { static final int MUSIC_PREVIOUS = -1; private static final String TAG = "MusicManager"; static MediaPlayer mp; private static int currentMusic = -1; private static int previousMusic = -1; public static void start(Context context, int music) { start(context, music, false); } public static void start(Context context, int music, boolean force) { if (!force && currentMusic > -1) { // already playing some music and not forced to change return; } if (music == MUSIC_PREVIOUS) { Log.d(TAG, "Using previous music [" + previousMusic + "]"); music = previousMusic; } if (currentMusic == music) { // already playing this music return; } if (currentMusic != -1) { previousMusic = currentMusic; Log.d(TAG, "Previous music was [" + previousMusic + "]"); // playing some other music, pause it and change pause(); } currentMusic = music; Log.d(TAG, "Current music is now [" + currentMusic + "]"); if (mp != null) { if (!mp.isPlaying()) { mp.start(); } } else { mp = MediaPlayer.create(context, R.raw.backGroundMusic); //Ur BackGround Music } if (mp == null) { Log.e(TAG, "player was not created successfully"); } else { try { mp.setLooping(true); mp.start(); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } } } public static void pause() { if (mp != null) { if (mp.isPlaying()) { mp.pause(); } } // previousMusic should always be something valid if (currentMusic != -1) { { previousMusic = currentMusic; Log.d(TAG, "Previous music was [" + previousMusic + "]"); } currentMusic = -1; Log.d(TAG, "Current music is now [" + currentMusic + "]"); } } public static void release() { Log.d(TAG, "Releasing media players"); try { if (mp != null) { if (mp.isPlaying()) { mp.stop(); } mp.release(); } } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } if (currentMusic != -1) { previousMusic = currentMusic; Log.d(TAG, "Previous music was [" + previousMusic + "]"); } currentMusic = -1; Log.d(TAG, "Current music is now [" + currentMusic + "]"); } } 

A continuación, en su MainActivity defina una variable booleana global y establézcala en true antes de setContentView (….) en onCreate() ie

  boolean continueBGMusic; .... protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); continueBGMusic=true; setContentView(R.layout.activity_main); ..... } 

A continuación, actualice onPause() como

  public void onPause() { super.onPause(); if(!continueBGMusic) MusicManager.pause(); } 

Y onResume() as

  public void onResume() { super.onResume(); continueBGMusic=false; MusicManager.start(this,R.raw.backGroundMusic); } 

Actualizar todas las tres actividades con la variable booleana y los dos métodos.

prueba esto

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK ) { music.stop(); return true; } return super.onKeyDown(keyCode, event); } 

De lo contrario si tiene alguna acción de botón por separado para cerrar la aplicación, allí a u puede llamar como music.stop ();

Si no tienes muchas actividades, puedes administrar esta tarea agregando banderas booleanas en actividades, donde quieres que se reproduzca la música.
Cuando detiene una Actividad, estos indicadores le mostrarán si otras Actividades necesitan su MediaPlayer

Así en su actividad principal:

 public class MainActivity extends Activity { static MediaPlayer introPlayer; static boolean sActive; @Override protected void onResume() { // starting the player if it is not playing if (!introPlayer.isPlaying()) { introPlayer.start(); introPlayer.setLooping(true); } // true when activity is active sActive = true; super.onResume(); } @Override protected void onPause() { sActive = false; super.onPause(); } @Override protected void onStop() { // before stoping mediaplayer checking whether it is not used by other activities if (introPlayer.isPlaying() && !(Activity2.sActive || Activity3.sActive)) { introPlayer.pause(); } super.onStop(); } } 

Otras actividades:

 public class Activity2 extends Activity { static boolean sActive; @Override protected void onPause() { sActive = false; super.onPause(); } @Override protected void onStop() { // pausing the player in case of exiting from the app if (MainActivity.introPlayer.isPlaying() && !(MainActivity.sActive || Activity3.sActive)) { MainActivity.introPlayer.pause(); } super.onStop(); } @Override protected void onResume() { sActive = true; if (!MainActivity.introPlayer.isPlaying()) { MainActivity.introPlayer.start(); MainActivity.introPlayer.setLooping(true); } super.onResume(); } } 

Y

 public class Activity3 extends Activity { static boolean sActive; @Override protected void onPause() { sActive = false; super.onPause(); } @Override protected void onStop() { // pausing the player in case of exiting from the app if (MainActivity.introPlayer.isPlaying() && !(MainActivity.sActive || Activity2.sActive)) { MainActivity.introPlayer.pause(); } super.onStop(); } @Override protected void onResume() { sActive = true; if (!MainActivity.introPlayer.isPlaying()) { MainActivity.introPlayer.start(); MainActivity.introPlayer.setLooping(true); } super.onResume(); } } 

Muy simple es cuando desea que su volumen MediaPlayer apagado, trate de configurar con setVolume (int leftVolume, int RightVolume)

Así que cuando quiera detener el volumen de MediaPlayer. utilizar

 music.setVolume(0,0); 

Incluso puede hacer una pausa con Stop MediaPlayer con music.pause();

Y detener mediaplayer con music.stop();

Usted tiene que simplemente llamar a la música. Stop () siempre que salga de la aplicación. Puede hacerlo en el método onStop() de su actividad de lanzador si su aplicación consiste sólo en una actividad.

Le sugeriría que utilice SoundPool si desea reproducir los sonidos de manera eficiente. Usándolo usted puede jugar muchos de sonidos concurrentes. También hice un proyecto de demostración de SoundPool. Lo puedes encontrar aquí

Cuando utilices el objeto MediaPlayer, tendrás que administrar todas las cosas por tu cuenta. También usé lo mismo en mi primer juego. Pero ahora para mi nuevo juego estoy usando SoundPool. Se añadió en API 1 n todavía rocas.

Lo hice siguiendo el camino

inicializar

  MediaPlayer player; Music music; 

En OnCreate

  music = new Music(); music.execute("abc"); 

Cuando quiera detener la música, generalmente en método onDestroy

  music.cancel(true); if(player.isPlaying()){ player.stop(); player.release(); } 

Crear clase de música

  public class Music extends AsyncTask<String, Integer, Void> { @Override protected Void doInBackground(String... params) { if(running) { player = MediaPlayer.create(getApplicationContext(), R.raw.bg_music1); player.setVolume(100,100); player.setLooping(true); player.start(); } else { player.stop(); player.release(); } return null; } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); running = false; } } 

Otra manera es usar servicios

Echa un vistazo a @ ActivityLifecycleCallbacks y realiza un seguimiento del inicio y la detención de actividades para saber cuándo se detiene tu aplicación. Esto sería cuando una llamada llega a onActivityStopped y no seguido por una llamada a onActivityStarted dentro de un período de tiempo pequeño.

La solución más sencilla es acceder a la configuración de Android> Aplicaciones> (nombre del reproductor de música) y, a continuación, pulsar "Parada de la fuerza". Confirme la operación y la música debe detenerse. Puede que no funcione con todos los reproductores de música, pero vale la pena una inyección.

Si debe tener código, ¿ha intentado asignar music.pause() ? Este comando detiene la música.

Para empezar a reproducir música, tendrá que averiguar cuándo empieza nuestra aplicación. Podemos hacerlo ampliando la clase de aplicación . El objeto de aplicación se instancia antes de cualquier actividad y se conserva hasta que nuestra aplicación termina con el sistema operativo Android. Esto lo hace ideal para controlar la reproducción sólo dentro de este objeto. Cuando creamos una nueva clase que extiende Application debemos registrarla en nuestro manifiesto.

Hemos determinado cuándo se crea nuestra aplicación, pero ¿qué hay de detener la música cuando nuestra aplicación va de primer plano a fondo? Android no ofrece un método sencillo para determinarlo. Para resolver ese problema seguí este muy buen artículo y parte del código de la solución era de allí.

Código de solicitud:

 package com.example.stackmusic; import android.app.Activity; import android.app.Application; import android.media.MediaPlayer; import android.os.Bundle; public class PlayMusicApp extends Application { private MediaPlayer music; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new MyLifecycleHandler()); music = MediaPlayer.create(this, R.raw.some_music); } /** * All activities created in our application will call these methods on their respective * lifecycle methods. */ class MyLifecycleHandler implements ActivityLifecycleCallbacks { private int resumed; private int stopped; public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } public void onActivityDestroyed(Activity activity) { } public void onActivityResumed(Activity activity) { // this is the first activity created if(resumed == 0) { music.start(); } ++resumed; } public void onActivityPaused(Activity activity) { } public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } public void onActivityStarted(Activity activity) { } public void onActivityStopped(Activity activity) { ++stopped; android.util.Log.w("test", "application is being backgrounded: " + (resumed == stopped)); // we are stopping the last visible activity if(resumed == stopped) { music.stop(); } } } } 

Registro en el manifiesto:

 <application android:name=".PlayMusicApp" 

No desea reproducir música en el subproceso de la interfaz de usuario. Idealmente crear un servicio para reproducir música en el hilo de fondo en lugar de la gestión de reproductor multimedia en el objeto de aplicación.

Para detener la canción, puedes hacer music.stop () en Destroy. Significa que la música se detiene al cerrar o matar la aplicación

 @Override protected void onDestroy() { music.stop(); super.onDestroy(); } 
  • ¿Cómo reproducir los archivos de audio directamente de la carpeta res / raw?
  • JNI: QCMediaPlayer mediaplayer NO presente
  • Reproductor de medios de Android: descargue a archivo y secuencia de archivo
  • El video no se reproduce en Android
  • MediaPlayer excepción en la actividad finsh
  • Exo player DASH Ejemplo de streaming
  • MediaPlayer.setDataSource () y prepare () no funciona - android
  • El reproductor de video apaga el modo en Android usando appcompat-v7
  • Android: ¿Cómo usar mediaController en la clase de servicio?
  • implementar detener y suspender para la alarma de Android
  • Descifrar audio / video sobre la marcha a MediaPlayer
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.