Android 当我按Back键或转到其他活动时,如何停止MediaPlayer而不出错

Android 当我按Back键或转到其他活动时,如何停止MediaPlayer而不出错,android,media-player,Android,Media Player,我创建了一个卡拉OK应用程序。但是我不能停止MediaPlayer而不出错。当我按下“后退”按钮回家时,我会听到“对不起,应用程序已停止工作”,如果我尝试启动另一个活动,同样的情况也会发生 这是我的密码 public class Main extends Activity implements MediaPlayerControl, OnClickListener { private MediaController mMediaController; private MediaPlayer mM

我创建了一个卡拉OK应用程序。但是我不能停止MediaPlayer而不出错。当我按下“后退”按钮回家时,我会听到“对不起,应用程序已停止工作”,如果我尝试启动另一个活动,同样的情况也会发生

这是我的密码

public class Main extends Activity implements MediaPlayerControl, OnClickListener {
private MediaController mMediaController;
private MediaPlayer mMediaPlayer;
public TextView subtitles;
Handler mHandler = new Handler();


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    subtitles = (TextView) findViewById(R.id.subs1);
    Button btnvol = (Button) findViewById(R.id.volc);
    btnvol.setOnClickListener(this);

    mMediaPlayer = new MediaPlayer();
    mMediaController = new MediaController(this);

    mMediaController.setMediaPlayer(Main.this);
    mMediaController.setAnchorView(findViewById(R.id.audioView));

    try {
        mMediaPlayer
                .setDataSource(
                        this,
                        Uri.parse("android.resource://com.app.audioplayer/raw/buchatri"));
        mMediaPlayer.prepare();
    } catch (IllegalStateException e){
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
              final long currentPos = mMediaPlayer.getCurrentPosition();
              if (currentPos < 5130) {
                    subtitles.setText("Stupid");
                } else if (currentPos > 5130 && currentPos < 10572) {
                    subtitles.setText("Sorry");
                } else if (currentPos > 10572 && currentPos < 10597) {
                    subtitles.setText("555+");
                } else if (currentPos > 15312 && currentPos < 18478) {
                    subtitles.setText("OMG");
                } else if (currentPos > 18478 && currentPos < 24191) {
                    subtitles.setText("AFK");
                } else if (currentPos > 24191 && currentPos < 28137) {
                    subtitles.setText("Help me !");
                } else if (currentPos > 28137 && currentPos < 29500) {
                    subtitles.setText("Oh no !");
                }
              mHandler.sendEmptyMessageDelayed(0, 1);
        }
    };
    mHandler.sendEmptyMessage(0);


    mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
            mHandler.post(new Runnable() {
                public void run() {
                    mMediaController.show(0);
                    mMediaPlayer.start();
                }
            });
        }
    });
}

protected void onDestroy() {
    super.onDestroy();
    mMediaPlayer.stop();
    mMediaPlayer.release();
}

public boolean canPause() {
    return true;
}

public boolean canSeekBackward() {
    return true;
}

public boolean canSeekForward() {
    return true;
}

public int getBufferPercentage() {
    int percentage = (mMediaPlayer.getCurrentPosition() * 100)
            / mMediaPlayer.getDuration();
    return percentage;
}

public int getCurrentPosition() {
    return mMediaPlayer.getCurrentPosition();
}

public int getDuration() {
    return mMediaPlayer.getDuration();
}

public boolean isPlaying() {
    return mMediaPlayer.isPlaying();
}

@Override
public void pause() {
    // TODO Auto-generated method stub
    super.onPause();
    if (mMediaPlayer.isPlaying()) {
        mMediaPlayer.stop();
    }

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
}

public void seekTo(int pos) {
    mMediaPlayer.seekTo(pos);

}

public void start() {
    mMediaPlayer.start();
}

public boolean onTouchEvent(MotionEvent event) {
    mMediaController.show(0);
    return false;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

}
}
公共类主扩展活动实现MediaPlayerControl,OnClickListener{ 专用媒体控制器; 私有媒体层; 公共文本视图字幕; Handler mHandler=新的Handler(); @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); 副标题=(文本视图)findViewById(R.id.subs1); 按钮btnvol=(按钮)findViewById(R.id.volc); btnvol.setOnClickListener(此); mMediaPlayer=新媒体播放器(); mMediaController=新媒体控制器(此); mMediaController.setMediaPlayer(Main.this); mMediaController.setAnchorView(findViewById(R.id.audioView)); 试一试{ 半透层 .setDataSource( 这 parse(“android。resource://com.app.audioplayer/raw/buchatri")); mmediplayer.prepare(); }捕获(非法状态){ e、 printStackTrace(); }捕获(IOE异常){ e、 printStackTrace(); } mHandler=新处理程序(){ @凌驾 公共无效handleMessage(消息消息消息){ //TODO自动生成的方法存根 超级handleMessage(msg); 最终长currentPos=mmediplayer.getCurrentPosition(); 如果(当前位置<5130){ 副标题:setText(“愚蠢”); }否则如果(当前位置>5130和当前位置<10572){ 副标题.setText(“对不起”); }否则如果(当前位置>10572和当前位置<10597){ 副标题.setText(“555+”); }否则如果(当前位置>15312和当前位置<18478){ 副标题:setText(“OMG”); }否则如果(当前位置>18478和当前位置<24191){ 副标题:setText(“AFK”); }否则如果(当前位置>24191和当前位置<28137){ 副标题.setText(“救命!”); }否则如果(当前位置>28137和当前位置<29500){ 副标题.setText(“哦,不!”); } mHandler.sendEmptyMessageDelayed(0,1); } }; mHandler.sendEmptyMessage(0); mmediplayer.setOnPreparedListener(新的OnPreparedListener(){ 已准备好公开作废(MediaPlayer mp){ mHandler.post(新Runnable(){ 公开募捐{ mMediaController.show(0); mmediplayer.start(); } }); } }); } 受保护的空onDestroy(){ super.ondestory(); mmediplayer.stop(); mmediplayer.release(); } 公共布尔canPause(){ 返回true; } 公共布尔值canSeekBackward(){ 返回true; } 公共布尔值canSeekForward(){ 返回true; } public int getBufferPercentage(){ 整数百分比=(mmediplayer.getCurrentPosition()*100) /mmediplayer.getDuration(); 回报率; } public int getCurrentPosition(){ 返回mmediplayer.getCurrentPosition(); } public int getDuration(){ 返回mmediplayer.getDuration(); } 公共布尔值显示(){ 返回mmetrayer.isPlaying(); } @凌驾 公共空间暂停(){ //TODO自动生成的方法存根 super.onPause(); if(mmediplayer.isPlaying()){ mmediplayer.stop(); } } @凌驾 受保护的void onPause(){ //TODO自动生成的方法存根 super.onPause(); } 公共无效seekTo(内部位置){ mMediaPlayer.seekTo(位置); } 公开作废开始(){ mmediplayer.start(); } 公共布尔onTouchEvent(运动事件){ mMediaController.show(0); 返回false; } @凌驾 公共void onClick(视图v){ //TODO自动生成的方法存根 } } 我想我在“if else”上有个错误。我如何解决这个问题?

你可以试试这个

发布后,应将mediaplayer设置为空

private void releaseMediaPlayer() {
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

首先尝试
mMediaPlayer.stop()
,然后通过
mMediaPlayer.release()

将其释放。我将尝试此操作。非常感谢。