videos studio segundo reproductor reproducir programacion plano pantalla escuchar con como apagada android audio android-activity media-player

android - studio - youtube en segundo plano apk



El reproductor multimedia de Android se reproduce en segundo plano, pero no se detiene cuando se elimina la aplicaciĆ³n (10)

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

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

Sin embargo, el sonido debería detenerse cuando el usuario cierra la aplicación, y no lo hace. ¿Cómo puedo conseguir esto?


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 + "]"); } }

Luego, en su MainActivity defina una variable booleana global y configúrela como true antes de setContentView (....) en onCreate() es decir

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

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

Actualice todas sus tres actividades con la variable booleana y los dos métodos.


Eche un vistazo a @ ActivityLifecycleCallbacks y ActivityLifecycleCallbacks seguimiento del inicio y la detención de las actividades para saber cuándo se "detiene" su aplicación. Esto sería cuando una llamada entra en onActivityStopped y no es seguida por una llamada a onActivityStarted dentro de un pequeño período de tiempo.


Hice esto de la siguiente manera

inicializar

MediaPlayer player; Music music;

en OnCreate

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

Cuando quieras detener la música, usualmente en el método onDestroy.

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

crear clase de musica

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 forma es usar el servicio.


La solución más sencilla es ir a la configuración de Android> Aplicaciones> (nombre de tu reproductor de música), luego presiona "Forzar parada". Confirme la operación, y la música debería parar. Puede que no funcione con todos los reproductores de música, pero vale la pena intentarlo.

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


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

Así que cuando quieras detener el volumen de tu MediaPlayer. utilizar

music.setVolume(0,0);

Incluso puedes pausar con detener tu MediaPlayer con music.pause();

And Stop mediaplayer with music.stop();


Para comenzar a reproducir música, deberá averiguar cuándo se inicia nuestra aplicación. Podemos hacerlo extendiendo la clase de Application . El objeto de la aplicación se crea una instancia antes de cualquier actividad y se conserva hasta que nuestra aplicación sea finalizada por el sistema operativo Android. Eso lo hace ideal para controlar la reproducción solo dentro de este objeto. Cuando creamos una nueva clase que extiende la aplicación, 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 pasa de primer plano a segundo plano? Android no ofrece un método listo para usar para determinar eso. 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(); } } } }

Inscripción en manifiesto:

<application android:name=".PlayMusicApp"

No quieres reproducir música en el hilo de la interfaz de usuario. Lo ideal es crear un servicio para reproducir música en un hilo de fondo en lugar de administrar el reproductor multimedia en el objeto Aplicación.


Para detener la canción, puedes hacer music.stop () en Destroy. significa que la música se detiene cuando tu aplicación se cierra o muere

@Override protected void onDestroy() { music.stop(); super.onDestroy(); }


Si no tiene muchas actividades, puede administrar esta tarea agregando banderas booleanas en las actividades, donde desea que se reproduzca la música.
Cuando detenga una actividad, estas banderas le mostrarán si otras Actividades necesitan su MediaPlayer

Así que en tu 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(); } }


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 separada para cerrar la aplicación, puede llamar como music.stop ();


Simplemente debe llamar a music.stop () cada vez que abandone la aplicación. Puede hacer esto en el método onStop() de su actividad de onStop() si su aplicación consiste solo en una actividad.

Te sugiero que uses SoundPool si quieres reproducir los sonidos de manera eficiente. Usándolo puedes reproducir muchos sonidos concurrentes. También hice un proyecto demo de SoundPool. Puedes encontrarlo here

Cuando use el objeto MediaPlayer, tendrá que administrar todas las cosas por su cuenta. También utilicé lo mismo en mi primer juego. Pero ahora para mi nuevo juego estoy usando SoundPool. Fue agregado en API 1 n todavía rocas.