una studio reproductor para musica mejor manejo lista fuente fondo crear como codigo canciones audios aplicacion android background media-player music

studio - Android detener la música de fondo



reproductor de musica android studio (9)

¿Por qué no solo haces un botón para detener la música? Es mucho más fácil y no tienes que forzar el cierre cada vez.

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();}});}

Hay que ir y, por lo tanto, el botón de hardware clave volverá a aparecer si presiona por accidente.

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

Y eso es todo, configurarlo en el manifiesto y ejecutar si hay algún problema, hágamelo saber

EDITAR - ¡ENCONTRARON UNA FÁCIL SOLUCIÓN DE 5-10 LÍNEAS! Vea MI PROPIA RESPUESTA ABAJO !!! ¡¡¡¡¡¡¡¡¡HURRA!!!!!!!!!

He buscado por 5 horas, docenas de publicaciones de SO, no hay respuestas, ¡¡¡y esto parece ser la cosa más sencilla y obvia !!!

EDICIÓN: por cierto, esto NO es una aplicación de reproductor de música, solo una aplicación para ver fotos y texto, abre múltiples actividades como menú y sobre, ver diferentes tipos de imágenes, etc. Solo quiero reproducir música de fondo simple mientras miro las fotos. y el texto, ¿por qué es tan difícil?

otro EDITAR - parece que la pregunta principal realmente es: "¿POR QUÉ EL PULSAR EL BOTÓN DEL HOGAR NO SE LLAMA EN PAREJA O ENTENER?" -Así que puedo saber cuándo parar el reproductor multimedia? ¿Y cómo los juegos que descargo en el mercado logran esto?

comienza la actividad en el hogar

entonces

el reproductor multimedia 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 sin interrupciones, lo cual es BUENO, eso es lo que quiero.

Ahora, cuando termine con mi aplicación muy simple (que solo muestra algunas fotos y textos en actividades de diff), hago clic en VOLVER varias veces para ir a la actividad principal / original, y luego una vez más para "salir", O , Simplemente presiono Inicio para "salir" porque me HAGO CON esta aplicación y ya no necesito escuchar esa música.

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 onPause la actividad en el hogar para otras actividades como ''menú'' y ''sobre'', tampoco hago qué usar pausar y reanudar al abrir nuevas actividades porque lo hago No quiero que la bonita música de fondo ''salte'' o sea interrumpida.

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 presiono ATRÁS de la actividad de mi hogar, la música se detiene y puedo seguir disfrutando de mi teléfono con Android en paz y tranquilidad, pero el problema es que, al presionar la tecla INICIO botón para "salir" de mi aplicación, esa música de fondo molesta sigue reproduciéndose.

EXTRAÑAMENTE

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

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

EDITAR TAMBIÉN no parece importar si player.stop (); está por encima o por debajo de super.onStop (); pero está 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 INICIO pero también la detiene cuando comienzo nuevas actividades :(

EDITAR - UN TRABAJO MUY COMÚN ALREDEDOR DE IVE VISTO MÚLTIPLES LUGARES, pero parece ridículo tener que hacer:

Esencialmente, mantenga la cuenta de la cantidad de actividades que se han abierto y cerrado (onResume y onPause probablemente serían las mejores, pero los puntos son irrelevantes) y cuando el conteo llegue a 0, detenga la música de fondo. SÍ, eso es bastante simple, pero ¿por qué tengo que hacer esto de manera programática? En realidad, la PREGUNTA MÁS GRANDE PARA ESTE POST es:

¿POR QUÉ NO PULSAR EL BOTÓN DE CASA?

Ponerlo en onDestroy no es una opción porque solo se llama a onDestroy cuando el sistema tiene poca memoria, o si cierra la aplicación, y eso está bien documentado.

Ignorar el botón INICIO tampoco es una opción ya que he leído que "no es posible" y he leído que es "extremadamente mal visto", de cualquier manera, lo evito.

No veo la necesidad de crear SERVICIO, e incluso si lo hiciera, cuando detendría el servicio, parece que tendría el mismo problema

AHORA AQUÍ ESTA LA COSA que me sorprende por completo, cada juego y cada aplicación que descargué del Android Market tiene una música de fondo muy hermosa, y cuando presiono VOLVER o INICIO porque he terminado de reproducir ese hermoso juego, la música se detiene , no se mantiene jugando en el fondo.

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

Pasé un mes leyendo cada página de developer.android.com, incluida la Guía de desarrollo, los tutoriales, los proyectos de muestra y la investigación de la sección de referencia, así como la búsqueda de este tema en Google durante 5 horas.

Tampoco entiendo por qué las 6 o 7 secuencias de SO con el mismo problema, no se han respondido, 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 presionas INICIO o ATRÁS. para "salir" de la aplicación para hacer algo más en tu teléfono.

¿Qué me estoy perdiendo?


¿de qué se trata un / registrar como un oyente @ el servicio en el onStart() y onStop() de sus actividades y cada vez que un oyente está (un) registrado su servicio verifica si hay algunos oyentes en su ArrayList<Listener> . Si listOfListeners.size() es 0 , su servicio llama a su método stopSelf() y se mata a sí mismo.

Al menos así sería como implementaría esto ...

Entonces, las cosas que necesitarías 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 ese es solo mi punto de vista ...


En cada actividad, enlace al servicio en onStart () y desvincula del servicio en onStop (). Cuando inicie el servicio, solo ajústelo y no llame a startService (...).

Al llamar a startService (), el servicio continuará ejecutándose hasta que se llame a stopService (), independientemente de la cantidad 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 separado de él.

Entonces, al vincular y desvincular los métodos onStart () y onStop () de cada actividad, encontrará 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.


He encontrado el mismo problema con mi proceso de desarrollo.

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

Mantuve una bandera en un singleton para saber cuándo el usuario apagó la música.

Otro problema que encontré es que mi aplicación (idk, si es parte de la versión de Android o no) estaba ejecutando el método onResume justo antes de que el jugador volviera a funcionar, así que ejecuté un bucle de tiempo para recibir al jugador no como un nulo puntero, y funciona porque se ejecuta en un subproceso diferente, por lo tanto, permite que la aplicación ejecute onResume sin fallar y la música a su lado.

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


Hoy estoy muy feliz, y todavía tengo pelo :) ¡He probado esto y funciona!

Primero, agrega esto a tu Manifiesto:

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

Segundo, agregue esto a su actividad / clase ''Inicio / Principal'':

@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 reemplace xYourClassNamex con, bueno, su nombre de clase :)

Ahora obviamente no necesitas los "brindis" pero te dirá lo que está pasando. Lo realmente interesante es cuando presionas ATRÁS de tu actividad ''Inicio / Principal'', obviamente obtienes 2 brindis, "PRESIONESTE ATRÁS DE TU ACTIVIDAD ''INICIO / PRINCIPAL''", y el segundo brindis es "TU ACTIVAS EN EL INTERRUPTOR EN TU APLICACIÓN ". Creo que sé por qué sucede esto, pero no importa; llamo "player.stop ();" de los 2 escenarios que significan que mi aplicación ya no está siendo ''utilizada''. Obviamente, haga más trabajo que "player.stop ();" si necesita :) Y también es obvio que no necesita el "otro" para "USTED ACTIVA LAS ACTIVIDADES DENTRO DE SU APLICACIÓN", porque no hay razón para "detener / pausar" la música de fondo, que es lo que necesitaba, pero si DEBE hacer algo cuando se inician nuevas actividades, bueno, aquí tienes :)

Espero que esto ayude a todos aquellos que buscan saber cuándo el usuario "deja / sale / se hace con" la aplicación :)

¡GRACIAS POR TODOS LOS COMENTARIOS, POSTALES Y AYUDA A TODOS! ¡HURRA!

EDITAR-

Esta parte debe estar en TODAS las actividades onPause:

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í 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 propia aplicación.

Ejemplo:

Cuando el reproductor multimedia está reproduciendo una canción y el usuario llega a casa, obviamente el usuario aún desea escuchar la canción como una tarea en segundo plano. Una vez que el usuario termina de escuchar, lo detiene manualmente ingresando a la aplicación y deteniendo (Aka, deteniendo el servicio que está reproduciendo la canción) o si la lista de reproducción está terminada, entonces deténgase. 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 sea nulo es obvia. Sin embargo; cuando ingresamos a la pausa, queremos asegurarnos de que el reproductor multimedia se esté deteniendo. PERO si nos vamos y la canción está casi terminada, entonces deténgala y suéltela.

ACTUALIZACIÓN 2

Compruebe el enlace aquí:

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

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


Me enfrenté al mismo problema. Te diré mi solución. Anulé onStop, onStart cada actividad y conté mi actividad iniciada con cierto retraso y el conteo llegó a cero, hice una pausa en la música.


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

Así que estoy usando Application child donde almaceno el tiempo afk y BaseActivity para anular onPause y onResume de todas mis actividades.


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 de administrador.

Cada actividad implementando como código posterior

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

Estoy usando este código con mi juego que está publicado y funciona muy bien.

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

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