20

我是Android新手,所以我遇到了问题。在 Android 中,我想在我的音乐播放器启动后立即播放背景音乐并让它继续播放,即使活动从一个变为另一个。我试过这段代码:

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

但是,当用户关闭应用程序时,声音应该停止,但事实并非如此。我怎样才能做到这一点?

4

10 回答 10

9

创建一个单独的类来处理多个条件

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

使用布尔变量和两种方法更新所有三个活动。

于 2013-09-18T12:48:51.163 回答
4

如果您没有太多活动,您可以通过在活动中添加布尔标志来管理此任务,您希望在其中播放音乐。
当您停止一个活动时,这些标志将向您显示其他活动是否需要您的 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();
        }
}
于 2015-05-28T23:25:25.687 回答
2

尝试这个

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

    return super.onKeyDown(keyCode, event);
}

否则,如果您有任何单独的按钮操作来关闭应用程序,您可以调用 music.stop();

于 2013-09-18T11:44:19.343 回答
0

我通过以下方式做到了这一点

初始化

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

另一种方法是使用服务

于 2014-11-12T10:27:58.890 回答
0

每当您离开应用程序时,您都必须简单地调用 music.stop()。onStop()如果您的应用仅包含一个活动,您可以在启动器活动的方法中执行此操作。

如果您想有效地播放声音,我建议您使用SoundPool 。使用它,您可以同时播放许多声音。我还做了一个 SoundPool 的演示项目。你可以在这里找到

当您使用 MediaPlayer 对象时,您必须自己管理所有事情。我在第一场比赛中也使用了同样的方法。但现在对于我的新游戏,我使用的是 SoundPool。它是在 API 1 中添加的,但仍然很稳定。

于 2013-09-18T11:51:31.567 回答
0

查看@ActivityLifecycleCallbacks并跟踪活动的启动和停止,以了解您的应用何时“停止”。这将是当调用 onActivityStopped 并且在很短的时间内没有调用 onActivityStarted 时。

于 2015-11-04T15:20:00.687 回答
0

要开始播放音乐,您需要弄清楚我们的应用程序何时启动。我们可以通过扩展Application类来做到这一点。应用程序对象在任何活动之前被实例化并被保留,直到我们的应用程序被 Android 操作系统终止。这使得仅在此对象内控制播放成为理想选择。当我们创建扩展 Application 的新类时,我们必须将其注册到清单中。

我们已经确定了我们的应用程序何时创建,但是当我们的应用程序从前台转到后台时停止音乐呢?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"

您不想在 UI 线程中播放音乐。理想情况下,创建一个在后台线程中播放音乐的服务,而不是在 Application 对象中管理媒体播放器。

于 2015-11-05T05:20:25.417 回答
0

要停止歌曲,您可以在 Destroy 上执行 music.stop()。意味着当您的应用关闭或终止时音乐停止

@Override
protected void onDestroy() {
    music.stop();
    super.onDestroy();
}
于 2017-03-25T10:05:08.443 回答
0

非常简单,当您想要关闭 MediaPlayer 音量时,尝试使用 setVolume(int leftVolume, int RightVolume) 进行设置

因此,每当您想关闭 MediaPlayer 的音量时。利用

music.setVolume(0,0);

即使你可以暂停你的 MediaPlayermusic.pause();

并停止媒体播放器music.stop();

于 2015-11-04T11:15:57.880 回答
-1

最简单的解决方案是进入您的 Android 设置 > 应用程序 >(您的音乐播放器的名称),然后点击“强制停止”。确认操作,音乐停止。它可能不适用于所有音乐播放器,但值得一试。

如果您必须有代码,您是否尝试过分配music.pause()?此命令停止音乐。

于 2015-11-05T03:42:48.830 回答