Android布尔值没有做正确的事情 - MediaPlayer在不应该播放时继续播放

时间:2012-06-02 12:19:42

标签: android checkbox menu boolean android-mediaplayer

我创建了一个以主Activity开头的应用。在该主Activity上,有2个复选框(cbPlayMusic和cbPlaySound)。当您通过单击开始按钮开始游戏时,使用以下代码:

btStart.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {

            Intent intent = new Intent(GobbleFishMainActivity.this, GobbleFishGame.class);
            intent.putExtra(INTENT_EXTRA_PLAY_MUSIC, cbMusic.isChecked());
            intent.putExtra(INTENT_EXTRA_PLAY_SOUND, cbSound.isChecked());


            startActivity(intent);
        }
    });

活动之上是:

public static final String INTENT_EXTRA_PLAY_MUSIC = "be.fielibert.gobblefish.extra.PLAY_MUSIC";
public static final String INTENT_EXTRA_PLAY_SOUND = "be.fielibert.gobblefish.extra.PLAY_SOUND";

然后当你点击Start,GobbleFishGame Activity时,这是onCreate代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    initBitmaps();
    mGraphView = new GraphView(this);
    mPlayMusic = getIntent().getBooleanExtra(GobbleFishMainActivity.INTENT_EXTRA_PLAY_MUSIC,true);
    mPlaySound = getIntent().getBooleanExtra(GobbleFishMainActivity.INTENT_EXTRA_PLAY_SOUND,true);

    setContentView(mGraphView);
    mGraphView.runProgram();
    playMusic();



}

当mPlayMusic为true时,由于playMusic()创建了GobbleFishGame活动,背景音乐开始播放:

 private void playMusic(){

    if (!mPlayMusic) {
        return;
    }
    mPlayer = MediaPlayer.create(GobbleFishGame.this, R.raw.song);
    mPlayer.setLooping(true);
    mPlayer.start();
}

到目前为止一切正常。但是,当您按Android设备上的菜单按钮时,会创建一个菜单,其中包含4个选项:主菜单,重启游戏,切换音乐,切换声音。 这是菜单的代码:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    menu.add(Menu.NONE, MENU_MENU, Menu.NONE, "Main menu");
    menu.add(Menu.NONE, MENU_RESTART,   Menu.NONE, "Restart game");
    menu.add(Menu.NONE, MENU_MUSIC,    Menu.NONE, "Toggle music");
    menu.add(Menu.NONE, MENU_SOUND,   Menu.NONE, "Toggle sound");
    return true;
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    mGraphView.pauseGame();
    return super.onMenuOpened(featureId, menu);
}

@Override
public void onOptionsMenuClosed(Menu menu) {
    super.onOptionsMenuClosed(menu);
    if(isStopping=true){
        return;
    }
    else{
        mGraphView.continueGame();
    }

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == MENU_MENU) {
        //mPlayer.release();
        isStopping=true;
        stopMusic();
        mGraphView.mState = STATE_STOP;
        Intent intent = new Intent(GobbleFishGame.this, GobbleFishMainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        //finish();
    }
    else if (item.getItemId() == MENU_RESTART) {
        mGraphView.init();
        mPlayer.reset();
        playMusic();
    }
    else if (item.getItemId() == MENU_MUSIC) {
        if (!mPlayMusic) {
            mPlayMusic=true;
            if (mPlayer != null) {
                //mPlayer.start();
                playMusic();
            }
            //playMusic();
        }
        if(mPlayMusic){
            mPlayMusic=false;
            stopMusic();
        }
    }
    else if (item.getItemId() == MENU_SOUND) {
        if (!mPlaySound) {
            mPlaySound=true;
            if (mp != null) {
                mp.reset();
            }
            //mp.reset();
        }
        if(mPlaySound){
            mPlaySound=false;
        }
    }

    return true;
}

但是,切换音乐和切换声音的选项将无效。这就是:当复选框音乐为真时(所以音乐正在播放),如果你然后切换音乐它工作正常。但是,如果你想重新打开音乐,它也可以工作,但暂停不再有效。在暂停时我调用mPlayer.pause,如果我没有打开或关闭音乐,这可以正常工作。如果我打开或关闭音乐,暂停因某些原因不再起作用。

这是暂停代码:

public void pauseGame() {
        if (mMode != MODE_PAUSE) {
            mMode = MODE_PAUSE;
            if (!mPlayMusic) {

                return;
            }
            if (mPlayer != null) {

                mPlayer.pause();


            }


        }
    }

这就是我的问题。切换声音也会出现同样的问题:如果我关闭声音,它就会起作用而且没有声音了(听起来像我的鱼吃另一条鱼或游戏声音时),但当我再次切换声音时,它不起作用:应该播放时没有播放声音。

我的猜测是它与布尔有关。我不知道我的代码有什么问题,我做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

MENU_MUSICMENU_SOUND处理中,您有以下代码行:

if (!mPlayMusic) {
    mPlayMusic=true;
    ... playMusic(); ...
}
if(mPlayMusic) {
    mPlayMusic=false;
    ... stopMusic(); ...
}

由于您在第一个else条件为真时省略了if,因此第二个被触发(由于第一个内部的分配mPlayMusic=true;),因此音乐会立即停止开始。