Intereting Posts
Андроида студия 1.2 град очень медленная Должен ли я восстановить savedinstancestate в onCreate или inRestoreInstanceState? Как я могу заставить webview использовать манифест кэша HTML5? Студия Android: эмулятор работает, но не отображается в Run App «выберите запущенное устройство» Как Intent может быть null в onHandleIntent ()? Перезапустите службу, даже если приложение отключено и продолжает работать в фоновом режиме даже после закрытия приложения How? Генерировать ошибку Javadoc для Android Studio Как я могу отклонить предложения в EditText? Невозможно добавить сервисы gms play 9.0.1, плагин google-services хочет 9.0.0 Можно ли показывать индикатор выполнения при загрузке изображения через Retrofit 2 Неожиданный префикс пространства имен «xmlns», найденный для тега LinearLayout Как зарегистрировать класс приложения в файле манифеста Android – с помощью runOnUiThread для изменения пользовательского интерфейса из потока Как безопасно сохранять секретный ключ в android Почему некоторые Android-телефоны заставляют наше приложение бросать java.lang.UnsatisfiedLinkError?

Android Media Player играет на заднем плане, но не останавливается, когда приложение убито

Я новичок в Android, поэтому у меня проблема. В Android я хочу играть в фоновую музыку, как только начнется мой музыкальный проигрыватель, и продолжите ее, даже если активность изменится с одного на другой. Я пробовал этот код:

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

Тем не менее, звук должен прекратиться, когда пользователь закрывает приложение, а это не так. Как я могу это достичь?

Solutions Collecting From Web of "Android Media Player играет на заднем плане, но не останавливается, когда приложение убито"

Создайте отдельный класс для обработки нескольких условий

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

Затем в вашей MainActivity определите глобальную логическую переменную и установите ее в true до setContentView (….) в onCreate() т.е.

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

Затем обновите onPause() как

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

И onResume() как

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

Обновите все три действия ur с помощью логической переменной и двух методов.

попробуй это

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

Иначе, если у вас есть отдельное действие кнопки для закрытия приложения, вы можете вызвать его как music.stop ();

Если у вас мало активности, вы можете управлять этой задачей, добавив в операции булевские флаги, где вы хотите, чтобы музыка воспроизводилась.
Когда вы остановите одно действие, эти флажки покажут вам, нужны ли другие виды деятельности для вашего MediaPlayer

Итак, в вашей основной деятельности:

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

Другие занятия:

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

А также

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

Очень просто, когда вы хотите отключить громкость вашего MediaPlayer, попробуйте настроить с помощью setVolume (int leftVolume, int RightVolume)

Поэтому всякий раз, когда вы хотите отключить громкость вашего MediaPlayer. использование

 music.setVolume(0,0); 

Даже вы можете сделать паузу, остановив свой MediaPlayer с помощью music.pause();

И остановите music.stop(); с music.stop();

Вы должны просто вызвать music.stop (), когда вы покидаете приложение. Вы можете сделать это в onStop() вашей активности запуска, если ваше приложение состоит только из одного действия.

Я бы предложил вам использовать SoundPool, если вы хотите эффективно воспроизводить звуки. Используя его, вы можете воспроизводить множество одновременных звуков. Я также сделал демонстрационный проект SoundPool. Вы можете найти его здесь

Когда вы используете объект MediaPlayer, вам придется управлять всеми вещами собственными силами. Я также использовал то же самое в своей первой игре. Но теперь для моей новой игры я использую SoundPool. Он был добавлен в все еще скалы API 1 n.

Я сделал это следующим образом

инициализировать

  MediaPlayer player; Music music; 

В OnCreate

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

Когда вы хотите остановить музыку, обычно в методе onDestroy

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

Создать музыкальный класс

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

Другим способом является использование услуги

Посмотрите @ ActivityLifecycleCallbacks и отслеживайте запуск и остановку действий, чтобы узнать, когда ваше приложение «остановлено». Это было бы, когда вызов включается в onActivityStopped и не сопровождается вызовом onActivityStarted в течение небольшого таймфрейма.

Самое простое решение – перейти в настройки Android> Приложения> (имя вашего музыкального проигрывателя), а затем нажать «Force Stop». Подтвердите операцию, и музыка должна остановиться. Возможно, он не работает со всеми музыкальными проигрывателями, но это стоит того.

Если у вас есть код, попробуйте ли вы назначить music.pause() ? Эта команда останавливает музыку.

Чтобы начать играть музыку, вам нужно будет выяснить, когда начнется наше приложение. Мы можем это сделать, расширив класс Application . Объект приложения создается до любой активности и сохраняется до тех пор, пока наше приложение не будет завершено ОС Android. Это делает его идеальным для управления воспроизведением только внутри этого объекта. Когда мы создаем новый класс, который расширяет приложение, мы должны зарегистрировать его в нашем манифесте.

Мы определили, когда будет создано наше приложение, но как насчет остановки музыки, когда наше приложение переходит от переднего плана к фону? Android не предлагает готового метода для определения этого. Чтобы решить эту проблему, я последовал этой очень хорошей статье, и часть кода решения была оттуда.

Код для заявки:

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

Регистрация в манифесте:

 <application android:name=".PlayMusicApp" 

Вы не хотите воспроизводить музыку в потоке пользовательского интерфейса. Идеально создать службу для воспроизведения музыки в фоновом потоке вместо управления медиаплеером в объекте Application.

Чтобы остановить песню, вы можете сделать music.stop () в Destroy. Означает, что музыка останавливается, когда ваше приложение закрыто или убито

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