Android Media Player играет на заднем плане, но не останавливается, когда приложение убито
Я новичок в Android, поэтому у меня проблема. В Android я хочу играть в фоновую музыку, как только начнется мой музыкальный проигрыватель, и продолжите ее, даже если активность изменится с одного на другой. Я пробовал этот код:
MediaPlayer music = MediaPlayer.create(MainActivity.this, R.drawable.bgscore);
music.start();
Тем не менее, звук должен прекратиться, когда пользователь закрывает приложение, а это не так. Как я могу это достичь?
Ответы
Ответ 1
Создайте отдельный класс для обработки нескольких условий
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()
i.e
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 с помощью логической переменной и двух методов.
Ответ 2
попробуйте это
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK ) {
music.stop();
return true;
}
return super.onKeyDown(keyCode, event);
}
else, если у вас есть отдельное действие кнопки для закрытия приложения, там вы можете вызвать музыку .stop();
Ответ 3
Если у вас мало активности,
Вы можете управлять этой задачей, добавляя логические флаги в действия, в которых вы хотите, чтобы музыка воспроизводилась.
Когда вы остановите одно действие, эти флажки покажут вам, нужны ли другие действия для вашего 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();
}
}
Ответ 4
Очень просто, когда вы хотите отключить громкость вашего MediaPlayer, попробуйте настроить с помощью setVolume (int leftVolume, int RightVolume)
Итак, всякий раз, когда вы хотите отключить громкость MediaPlayer. используйте
music.setVolume(0,0);
Даже вы можете сделать паузу, остановив свой MediaPlayer с помощью music.pause();
И остановите медиаплеер с music.stop();
Ответ 5
Вам нужно просто вызвать music.stop(), когда вы покидаете приложение. Вы можете сделать это в методе onStop()
вашей активности запуска, если ваше приложение состоит только из одного действия. p >
Я бы предложил вам использовать SoundPool, если вы хотите эффективно воспроизводить звуки. Используя его, вы можете воспроизводить множество одновременных звуков. Я также сделал демонстрационный проект SoundPool. Вы можете найти здесь
Когда вы используете объект MediaPlayer, вам придется управлять всеми вещами собственными силами. Я также использовал то же самое в своей первой игре. Но теперь для моей новой игры я использую SoundPool. Он был добавлен в все еще скалы API 1 n.
Ответ 6
Я сделал это следующим образом
инициализировать
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;
}
}
Другой способ - использовать службу
Ответ 7
Посмотрите @ActivityLifecycleCallbacks и отслеживайте запуск и остановку действий, чтобы узнать, когда ваше приложение "остановлено". Это было бы, когда вызов включается в onActivityStopped и не сопровождается вызовом onActivityStarted в течение небольшого таймфрейма.
Ответ 8
Самое простое решение - перейти в настройки Android > Приложения > (имя вашего музыкального проигрывателя), а затем нажать "Force Stop". Подтвердите операцию, и музыка должна остановиться. Это может не работать со всеми музыкальными проигрывателями, но это стоит того.
Если у вас есть код, попробуйте ли вы назначить music.pause()
? Эта команда останавливает музыку.
Ответ 9
Чтобы начать играть музыку, вам нужно будет выяснить, когда начнется наше приложение. Мы можем это сделать, расширив класс 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.
Ответ 10
Чтобы остановить песню, вы можете сделать music.stop() в Destroy. означает, что музыка останавливается, когда ваше приложение закрыто или убито
@Override
protected void onDestroy() {
music.stop();
super.onDestroy();
}