Android Stop Música de fondo

EDIT – ENCONTRÓ UNA FÁCIL SOLUCIÓN DE LÍNEA 5-10! ¡Vea MI PROPIA RESPUESTA ABAJO !!! ¡¡¡¡¡¡¡¡¡HURRA!!!!!!!!!

He buscado durante 5 horas, docenas de puestos SO, sin respuestas, y esto parece ser la cosa freaking obvio más simple !!!

EDIT-btw, esto no es una aplicación de reproductor de música, sólo una aplicación para ver fotos y texto, abre múltiples actividades como menú y sobre, ver tipos de dif de imágenes, etc Sólo quiero jugar música de fondo simple mientras mira a través de las fotos Y el texto, ¿por qué es tan difícil?

Otro EDIT – parece que la principal pregunta es realmente: "¿POR QUÉ PRESIONAR EL BOTÓN DE CASA NO LLAMAR onPause o onStop ???" -¿Puedo saber cuándo parar el reproductor multimedia? Y cómo los juegos i descargar en el mercado lograr esto ???

Comienza la actividad en el hogar

entonces

Media player comienza:

player = MediaPlayer.create(this, R.raw.idil); player.setLooping(true); player.setVolume(100,100); player.start(); 

Jugador declarado fuera de onCreate

 MediaPlayer player; 

Cuando se abren otras actividades, la música de fondo continúa ininterrumpida, que es BUENA, eso es lo que quiero.

Ahora, cuando he terminado con mi aplicación muy sencilla (que sólo muestra algunas fotos y textos en actividades diff), o haga clic en BACK varias veces para llegar a la actividad original / original y, a continuación, una vez más para "salir", O , Simplemente presionar a casa para "salir" porque estoy HECHO con esta aplicación y no necesito oír esa música más.


OPCIÓN 1

Llamar a player.stop(); En una anulación de onPause , esto no es lo que quiero porque la música de fondo se detiene cuando dejo la actividad en casa para otras actividades como 'menu' y 'about', tampoco lo que usar pausa y reanudar al abrir nuevas actividades porque lo hago No quiero que la bonita música de fondo salte o se interrumpa.


OPCION 2

 @Override protected void onPause() { super.onPause(); if (this.isFinishing()){ player.stop(); } } 

Esto es mejor porque la música de fondo no se detiene entre las actividades, y cuando presione atrás de mi actividad en casa, la música se detiene, y puedo seguir disfrutando de mi teléfono de diversión de Android en paz y tranquilidad, pero el problema es, al presionar el HOME Botón para "salir" de mi aplicación, que la música de fondo molestos sigue jugando.


EXTRAÑAMENTE

 @Override protected void onStop() { super.onStop(); if (this.isFinishing()){ player.stop(); } } 

Hace lo mismo que onPause (y yo entiendo las diferencias reales)

EDITAR- TAMBIÉN no parece importar si player.stop (); Está por encima o por debajo de super.onStop (); Pero afectando algo que no puedo ver, de cualquier manera, todavía no hay SOLUCIÓN 🙁

Ooooo

Ooooo

EDITAR OTRA OPCIÓN, PERO NO FUNCIONA

 public void onUserLeaveHint() { player.stop(); super.onUserLeaveHint(); } 

Esto detiene la música cuando presiono HOME pero también lo detiene cuando comienzo nuevas actividades 🙁

EDIT – UN TRABAJO MUY COMÚN ALREDEDOR DE IVE VISTO MÚLTIPLES LUGARES, pero parece rediculous tener que hacer:

Esencialmente mantener la cuenta del número de actividades que se han abierto y cerrado (onResume y onPause probablemente sería mejor, pero que los puntos irrelevantes) y cuando ese recuento llega a 0, detener la música de fondo. SÍ que es bastante simple, pero ¿por qué tengo que programar esto, en realidad la pregunta más grande para este post es:

¿POR QUÉ PRESIONAR EL BOTÓN INICIO NO LLAMAR onPause o onStop ???

Ponerlo en onDestroy no es una opción porque onDestroy solo se llama cuando el sistema tiene poca memoria, o forzar a cerrar you app, y eso está bien documentado.

Sobrepasar el botón HOME tampoco es una opción, ya que he leído su "no es posible" y he leído su "muy mal visto", de cualquier manera Im evitando que

No veo la necesidad de crear SERVICIO, e incluso si lo hice, cuándo pararía el servicio, parece que tendría el mismo problema

AHORA ESTA LA COSA que sopla completamente mi mente, cada juego y cada aplicación que he descargado del mercado androide tiene una música de fondo muy hermosa, y cuando presiono BACK o HOME porque estoy hecho jugando ese juego encantador la música para , no mantener Jugando en el fondo.

Estoy muy frustrado, y siento que es porque siento que estoy perdiendo algo muy simple, porque este es uno de los problemas de ciclo de vida más básicos con cualquier aplicación.

Pasé un mes leyendo cada página de developer.android.com, incluyendo la Guía del desarrollador, los tutoriales, proyectos de ejemplo, y la investigación de la sección Refernece, así como google-ing de este tema durante 5 horas.

También no entiendo por qué los 6 o 7 hilos de SO con el mismo problema, no han sido respondidas, cada aplicación descargable en el mercado deja de reproducir su música (a menos que sea un reproductor de música de fondo) cuando pulse HOME o BACK o lo que sea " Salir "de la aplicación para ir a hacer algo más en su teléfono.

¿Qué me estoy perdiendo?

Estoy muy feliz hoy, y aún tengo cabello 🙂 He probado esto y funciona !!!

Primero, agregue esto a su Manifiesto:

 <uses-permission android:name="android.permission.GET_TASKS"/> 

En segundo lugar, añada esto a su 'Inicio / Principal' Actividad / Clase:

  @Override protected void onPause() { if (this.isFinishing()){ //basically BACK was pressed from this activity player.stop(); Toast.makeText(xYourClassNamex.this, "YOU PRESSED BACK FROM YOUR 'HOME/MAIN' ACTIVITY", Toast.LENGTH_SHORT).show(); } Context context = getApplicationContext(); ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> taskInfo = am.getRunningTasks(1); if (!taskInfo.isEmpty()) { ComponentName topActivity = taskInfo.get(0).topActivity; if (!topActivity.getPackageName().equals(context.getPackageName())) { player.stop(); Toast.makeText(xYourClassNamex.this, "YOU LEFT YOUR APP", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(xYourClassNamex.this, "YOU SWITCHED ACTIVITIES WITHIN YOUR APP", Toast.LENGTH_SHORT).show(); } } super.onPause(); } 

Y, obviamente, reemplazar xYourClassNamex con, así, su nombre de clase 🙂

Ahora, obviamente, usted no necesita los "brindis", pero le dirá lo que está pasando. El tema muy intersting es cuando presionas BACK desde tu actividad de 'Home / Main', obviamente obtienes 2 Tostadas, "TE PRENSED BACK FROM YOUR HOME / MAIN 'ACTIVITY", y el 2do Toast es "ACTIVIDADES DE SWITCHED EN SU APLICACIÓN ". Creo que sé por qué sucede esto, pero no importa porque llamo "player.stop ();" De los 2 escenarios que significan que mi aplicación ya no está siendo "utilizada". Obviamente hacer más trabajo que "player.stop ();" Si usted necesita 🙂 Y también obvio que usted no necesita el "else" para "ACTIVIDADES DE SWITCHED CON SU APP", porque no hay razón para "parar / pausa" la música de fondo, que es lo que necesitaba, pero si usted Tienes que hacer algo cuando se inician nuevas actividades, bueno, aquí tienes 🙂

Espero que esto ayude a cualquiera que quiera saber cuando el usuario "sale / sale / se hace con" la aplicación 🙂

GRACIAS POR TODOS LOS COMENTARIOS POSTALES Y AYUDAR A TODOS !!! ¡HURRA!

EDITAR-

Esta parte tiene que estar en ONPause de CADA actividad:

 Context context = getApplicationContext(); ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> taskInfo = am.getRunningTasks(1); if (!taskInfo.isEmpty()) { ComponentName topActivity = taskInfo.get(0).topActivity; if (!topActivity.getPackageName().equals(context.getPackageName())) { player.stop(); Toast.makeText(xYourClassNamex.this, "YOU LEFT YOUR APP", Toast.LENGTH_SHORT).show(); } } 

Así que sabrás si el usuario dejó tu aplicación de CUALQUIERA de las actividades. Esto es bueno saberlo 🙂

La forma en que funciona el reproductor multimedia es que se ejecuta como un servicio y luego se detiene MANUALMENTE cuando el usuario lo detiene en la aplicación misma.

Ejemplo:

Cuando el reproductor de medios está reproduciendo una canción y el usuario llega a casa, obviamente el usuario todavía quiere escuchar la canción como una tarea de fondo. Después de que el usuario ha terminado de escuchar, el usuario lo detiene manualmente, entrando en la aplicación y deteniéndolo (o, si la lista de reproducción está terminada), detenga. Sencillo.

Este es el comportamiento esperado. Y es exactamente cómo funciona la aplicación de música.

ACTUALIZAR

 @Override protected void onPause() { super.onPause(); if (this.isFinishing()){ player.stop(); } } 

Necesita ser cambiado a

 @Override protected void onPause() { super.onPause(); if (mediaPlayer != null){ mediaPlayser.stop(); if (isFinishing()){ mediaPlayer.stop(); mediaPlayer.release(); } } } 

Una explicación:

La razón por la que estamos comprobando que el objeto no es nulo es evidente. Sin embargo; Cuando entramos en la pausa, queremos asegurarnos de que el mediaplayer está deteniéndose. PERO si nos vamos y la canción está casi terminada, entonces la paramos y la soltamos.

ACTUALIZAR 2

Compruebe el enlace aquí:

https://stackoverflow.com/a/6704844/529691

Esto se puede utilizar para detectar si su aplicación se ha movido fuera de la punta actual de la pila de aplicaciones.

Me enfrenté al mismo problema. Te diré mi solución. I overrided onStop, onStart cada actividad y contó mi actividad iniciada con un poco de retardo y cuenta llega a cero, hice una pausa de música.

¿Cómo se trata de un / register como un listener @ el servicio en el onStart() y onStop() de sus actividades y cada vez que un oyente es (un) registrado su servicio comprueba si tiene algunos oyentes en su ArrayList<Listener> . Si el listOfListeners.size() es 0 entonces su servicio llama a su método stopSelf() y se mata a sí mismo.

Al menos así es como implementaría esto …

Así, las cosas que usted necesita son:

  • 2 Interfaces ( Observer , Observable )

  • Implementar Observer en Activity , Observable en Service

  • ArrayList<Observer> en Service

  • registerObserver(Observer o) y unregisterObserver(Observer o) en Service

Pero eso es sólo mi punto de vista …

¿Por qué no acaba de hacer un botón para detener la música es mucho más fácil y no tiene que forzar cada vez cerrar

 Button exit =(Button) findViewById(R.id.exit); exit.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO: Implement this method startActivity(new Intent("com.justme.worldexplorer.EXIT")); finish(); Music I'd.stop();}});} 

Allí usted va y así que el botón de hardware dominante detrás dosent sale si usted presiona por accidente

 public boolean onKeyDown(int KeyCode,KeyEvent event){ return false; } 

Y eso es lo establecido en el manifiesto y ejecutar si cualquier problema me dejó saber

 private static HashMap<String, Boolean> focus = new HashMap<String, Boolean>(); public static void check(Context context, boolean hasFocus) { handler.removeMessages(0); focus.put(((Activity)context).getLocalClassName(), hasFocus); handler.sendEmptyMessageDelayed(0, 500); } public static void check(String classname, boolean hasFocus) { handler.removeMessages(0); focus.put(classname, hasFocus); handler.sendEmptyMessageDelayed(0, 500); } private static Handler handler = new Handler() { @Override public void handleMessage(Message msg) { Iterator<Boolean> it = focus.values().iterator(); while(it.hasNext()) { if(it.next()) return; } pause(); super.handleMessage(msg); } }; 

Este es un método de clase manager.

Cada actividad implementando como después de código

 @Override public void onWindowFocusChanged(boolean hasFocus) { MusicManager.check(this, hasFocus); super.onWindowFocusChanged(hasFocus); } 

Estoy usando este código con mi juego que se publica y funciona muy bien.

¿Qué parte de este código es terrible? Y dónde está la mejor solución? Quiero saber si existen.

Mike, me respondes que mi respuesta es terrible y no funciona, ¿Qué tiene de malo esto?

En cada actividad, vincule al servicio en onStart () y desvincule del servicio en onStop (). Al iniciar el servicio, sólo enlazar con él y no llamar startService (…).

Al llamar a startService (), el servicio continuará ejecutándose hasta que se llame a stopService (), independientemente del número de actividades vinculadas a él. Si no llama al servicio de inicio, el servicio se detendrá automáticamente una vez que todas las actividades se hayan desatado.

Así, al enlazar y desvincular los métodos onStart () y onStop () de cada actividad, verá que el servicio (música) continuará hasta que deje su aplicación con el botón de inicio, la tecla de retroceso, el tiempo de espera de la pantalla, etc.

Para aquellos que todavía están buscando una solución en piruleta o simplemente sin usar la cosa de permiso, me ocurrió otra solución como último recurso. Podemos medir el tiempo que el usuario ha estado afk. Si fue más de X ms, entonces usted puede considerar que dejó la aplicación y detener la música.

Así que estoy usando el niño de la aplicación donde almaceno el tiempo afk y BaseActivity para anular onPause y onResume de todas mis actividades.

He encontrado el mismo problema con mi proceso del desarrollo.

Solucioné esto usando onPause y onResume y con los métodos pause () e start () en el reproductor que guardé en mi contenedor principal, llamando fragmentos en lugar de actividades.

Mantuve una bandera en un singleton para saber cuando la música fue apagada por el usuario.

Otro problema que encontré es que mi aplicación (idk si es parte de la construcción de Android o no) estaba ejecutando el método onResume justo antes de que el jugador de nuevo, por lo que corrió un bucle de tiempo para recibir el jugador no como un nulo Puntero, y funciona porque se ejecuta en un hilo diferente, por lo tanto, permitiendo a la aplicación para ejecutar el onResume sin estrellarse y la música junto a él.

Lo encuentro mejor (código más pequeño para escribir) y no-invasivo de permiso;).

  • Ayuda de Android: ¿Cómo abrir una URL de archivo de vídeo remota para reproducir en MediaPlayer sin tener que abrir una ventana del navegador?
  • La aplicación de vista web de Android no permite que el reproductor de video pase a pantalla completa
  • Reproducción de audio de MediaStore en un reproductor de medios Android
  • Android media player - cómo deshabilitar la gama de solicitud? (Rotura de audio roto en Nexus 7)
  • El tipo mime de la salida de grabación de audio se establece como video
  • Cómo jugar a la radio en vivo .asx video / x-ms-asf?
  • Android: ¿Cómo crear un reproductor de vídeo?
  • Cómo reproducir audio en segundo plano en segundo plano en Android?
  • Instancia de MediaPlayer: stop se comporta como una pausa
  • Error de MediaPlayer de Android al usar las llamadas de reinicio () y de liberación ()
  • Android: ¿Cómo configurar el volumen de MediaPlayer mediante programación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.