onBackPressed时无法停止MediaPlayer

时间:2017-05-06 19:09:28

标签: android onbackpressed

当我按下后退按钮返回主菜单时,我在停止播放音乐时遇到了麻烦。游戏在10次中崩溃9次并返回IllegalStateException,我将在下面发布。音乐在GameScreen中初始化,当我尝试将其置于GameScreen中的onBackPressed方法时,它会崩溃。这是我的MusicManager类和GameScreen的重要部分。任何帮助将不胜感激!

public class MusicManager implements MediaPlayer.OnCompletionListener{

AudioManager amg;

private MediaPlayer mMediaPlayer;
private MediaPlayer mMediaPlayer1;

private String mAssetFile;
private boolean mIsPrepared = false;
private boolean mIsPrepared1 = false;
private ScreenManager mScreenManager;
public MusicManager(Game game, ScreenManager mScreenManager) {
    super();
mScreenManager = new ScreenManager();
    mMediaPlayer = new MediaPlayer();
    mMediaPlayer1 = new MediaPlayer();

    try{            AssetManager assetManager = game.getActivity().getAssets();
        AssetFileDescriptor assetDescriptor = assetManager.openFd("Sounds/GameScreen1.ogg");
        AssetFileDescriptor assetDescriptor1 = assetManager.openFd(("Sounds/Game-Menu.ogg"));

            //assetDescriptor = assets.openFd("clicksound");
        mMediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(),
                    assetDescriptor.getStartOffset(),
                    assetDescriptor.getLength());

       mMediaPlayer1.setDataSource(assetDescriptor1.getFileDescriptor(),
                assetDescriptor1.getStartOffset(),
                assetDescriptor1.getLength());

            // Prep the audio for playback
        mMediaPlayer.prepare();
        mMediaPlayer1.prepare();
        mIsPrepared = true;
        mIsPrepared1 = true;
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer1.setOnCompletionListener(this);

    } catch (IOException e) {
        String errorTag = "Error:";
        String errorMessage = "Music clip cannot be loaded.";
        Log.w(errorTag, errorMessage);
    }
}

public  void play() {
 if (mMediaPlayer.isPlaying())
       return;
    try {
        synchronized (this) {
            if (!mIsPrepared)
                mMediaPlayer.prepare();
            mMediaPlayer.start();
        }
    } catch (Exception e) {
        String errorTag = "Error:";
        String errorMessage = "Music clip cannot be played.";
        Log.w(errorTag, errorMessage);
    }
}
public  void play1() {
    if (mMediaPlayer1.isPlaying())
        return;
    try {
        synchronized (this) {
            if (!mIsPrepared1)
                mMediaPlayer1.prepare();
                mMediaPlayer1.start();
        }
    } catch (Exception e) {
        String errorTag = "Error:";
        String errorMessage = "Music clip1 cannot be played.";
        Log.w(errorTag, errorMessage);
    }
}

public void stop() {
    mMediaPlayer.stop();
    synchronized (this) {
        mIsPrepared = false;
    }
}

public void stop1() {
    mMediaPlayer1.stop();
    synchronized (this) {
        mIsPrepared1 = false;
    }
}

public void pause() {
    if (mMediaPlayer.isPlaying())
        mMediaPlayer.pause();
}

public void pause1() {
    if (mMediaPlayer1.isPlaying())
        mMediaPlayer1.pause();
}

/**
 * Determine if the music clip will loop
 *
 * @param looping
 *            Boolean true to loop, false for play once.
 */
public void setLooping(boolean looping) {
    mMediaPlayer.setLooping(looping);
}

public MediaPlayer MediaPlayer(){
    return mMediaPlayer;
}
public void setLooping1(boolean looping) {
    mMediaPlayer1.setLooping(looping);
}

/**
 * Set the playback volume
 *
 * @param volume
 *            Playback volume (0-1)
 */
public void setVolume(float volume) {
    mMediaPlayer.setVolume(volume, volume);
}
public void setVolume1(float volume) {
    mMediaPlayer1.setVolume(volume, volume);
}

/**
 * Set the playback volume
 *
 * @param leftVolume
 *            Left channel playback volume (0-1)
 * @param rightVolume
 *            Right channel playback volume (0-1)
 */
public void setVolume(float leftVolume, float rightVolume) {
    mMediaPlayer.setVolume(leftVolume, rightVolume);
}

public boolean isPlaying() {

    return mMediaPlayer.isPlaying();
}

public boolean isPlaying1() {
    return mMediaPlayer1.isPlaying();
}

public boolean isLooping() {
    return mMediaPlayer.isLooping();
}
public boolean isLooping1() {
    return mMediaPlayer1.isLooping();
}


public void dispose() {
   if (mMediaPlayer.isPlaying())
        mMediaPlayer.stop();
    mMediaPlayer.release();
}

public void dispose1() {
    if (mMediaPlayer1.isPlaying())
        mMediaPlayer1.stop();
    mMediaPlayer1.release();
}

@Override
public void onCompletion(MediaPlayer player) {
    synchronized (this) {
        mIsPrepared = false;
    }
}

GAMESCREEN

public class CardDemoGameScreen extends GameScreen {
 private SoundManager mSoundManager;
private MusicManager mMusicManager;
private ScreenManager mScreenManager;
private MediaPlayer mediaPlayer;

public CardDemoGameScreen(Game game) {
    super("CardDemoGameScreen", game);
    mediaPlayer = new MediaPlayer();
    mSoundManager = new SoundManager(game);
    mScreenManager = new ScreenManager();
    mMusicManager = new MusicManager(game, mScreenManager);

 public void update(ElapsedTime elapsedTime) {
    //NOTE: elapsed time has time between frames AND time since program 
started

    mMusicManager.play();
   // mMusicManager.isPlaying();
    mMusicManager.setLooping(true);


        mPlayer.update(elapsedTime);

        mPlayer.updateLayer(mLayerViewport, 0, LEVEL_WIDTH, 0, 
LEVEL_HEIGHT);

        mPlayer.HandleTouch(mScreenViewport, mLayerViewport, worldZoom);

        mPlayer.updateHandLayout(LEVEL_WIDTH, LEVEL_HEIGHT);

...

 @Override
public boolean onBackPressed() {

   mMusicManager.dispose();

    return true;
}

栈跟踪

05-06 20:04:44.371 30964-31104/uk.ac.qub.eeecs.gage E/AndroidRuntime: FATAL EXCEPTION: Thread-2901
                                                                  Process: uk.ac.qub.eeecs.gage, PID: 30964
                                                                  java.lang.IllegalStateException
                                                                      at android.media.MediaPlayer.isPlaying(Native Method)
                                                                      at uk.ac.qub.eeecs.game.cardDemo.MusicManager.play(MusicManager.java:64)
                                                                      at uk.ac.qub.eeecs.game.cardDemo.CardDemoGameScreen.update(CardDemoGameScreen.java:177)
                                                                      at uk.ac.qub.eeecs.gage.Game.doUpdate(Game.java:330)
                                                                      at uk.ac.qub.eeecs.gage.Game.access$200(Game.java:26)
                                                                      at uk.ac.qub.eeecs.gage.Game$GameLoop.run(Game.java:527)
                                                                      at java.lang.Thread.run(Thread.java:818)

1 个答案:

答案 0 :(得分:0)

请更改像这样的dispose方法并捕获一些例外: 并尝试将mMediaPlayer.release()更改为reset()

public void dispose() {
if (mMediaPlayer != null) {
    if (mMediaPlayer.isPlaying()) {
        try {
            //mMediaPlayer1.stop();
            //mMediaPlayer.release()
            mMediaPlayer.reset();
        } catch (Exception e) {
            e.printStackTrace();
          }
       }
    }
}