Android 当我按Back键或转到其他活动时,如何停止MediaPlayer而不出错
我创建了一个卡拉OK应用程序。但是我不能停止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
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()
将其释放。我将尝试此操作。非常感谢。