Java 如何正确发布Android MediaPlayer
我正在尝试在我的android应用程序中添加一个按钮,当按下按钮时,它会播放MP3。 我已经让它工作了,但是没有办法释放mediaPlayer对象-因此即使在我离开活动后它仍会继续播放。如果我在react()方法之外初始化MediaPlayer对象(按下按钮时会调用该对象),则会导致应用程序在活动打开时强制关闭。但是,如果在react()方法中初始化MediaPlayer,则无法在onQuit()方法中使用mplayer.release。我在这里看不到什么Java 如何正确发布Android MediaPlayer,java,android,Java,Android,我正在尝试在我的android应用程序中添加一个按钮,当按下按钮时,它会播放MP3。 我已经让它工作了,但是没有办法释放mediaPlayer对象-因此即使在我离开活动后它仍会继续播放。如果我在react()方法之外初始化MediaPlayer对象(按下按钮时会调用该对象),则会导致应用程序在活动打开时强制关闭。但是,如果在react()方法中初始化MediaPlayer,则无法在onQuit()方法中使用mplayer.release。我在这里看不到什么 public void rea
public void react(View view) {
MediaPlayer mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
mediaPlayer.start();
}
protected void onStop(){
mediaPlayer.release();
mediaPlayer = null;
}
由于明显的原因和
MediaPlayer mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
public void react(View view) {
mediaPlayer.start();
}
protected void onStop(){
mediaPlayer.release();
mediaPlayer = null;
}
使其强制关闭
更新:
下面是整个java类
public class ToBeOrNot extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_to_be_or_not);
}
MediaPlayer mediaPlayer;
public void react(View view) {
mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
mediaPlayer.start();
}
protected void onStop(){
mediaPlayer.release();
mediaPlayer = null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.activity_to_be_or_not, menu);
// Locate MenuItem with ShareActionProvider
return true;
}
}
我认为它的作用相对来说是不言自明的。调用时,它显示一些文本和一个按钮,当点击该按钮时,开始播放录音。当有人点击后退按钮时,它应该返回到上一个活动并停止录制。
谢谢你帮助我 不能在所有方法之外初始化mediaplayer对象。如果您这样做,它会尝试使用尚未创建的上下文。您需要将其声明为类变量(在方法外部),并在内部对其进行初始化:
MediaPlayer mediaPlayer;
public void react(View view) {
mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord);
mediaPlayer.start();
}
protected void onStop(){
mediaPlayer.release();
mediaPlayer = null;
}
此外,我建议大家在上读一读。这对我很有效
public class MainActivity extends AppCompatActivity {
MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mediaPlayer = MediaPlayer.create(this, R.raw.beep_warning);
final CheckBox checkBox = (CheckBox) findViewById(R.id.checkBox);
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (checkBox.isChecked()) {
mediaPlayer.start();
mediaPlayer.setLooping(true);
}
else{
mediaPlayer.pause();
}
}
});
}
@Override
protected void onStop() {
super.onStop();
mediaPlayer.release();
}
根据谷歌的说法,你可以在MediaPlayer
中实现一个监听器,如下例所示
完成后,您可以自动释放和重置
MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
mp.release();
mp=null;
}
});
mp.start();
啊,非常感谢!那真是个愚蠢的错误。我意识到示波器是我遇到的问题,但我的大脑不工作,我想不出如何修复它。所以我复制了你的示例,现在它运行良好,但当我按下启动声音的按钮后按下后退按钮时,应用程序强制关闭。有什么想法吗?它有很多潜在的问题。我建议再问一个问题,解释一下您在所有生命周期方法(创建、恢复、暂停、停止等)中所做的工作。另外,解释您希望它做什么。在发布之前检查mediaPlayer是否为null:if(mediaPlayer!=null)mediaPlayer.release();如果你的另一个问题得到了回答,你想问一个新问题,你应该打开一个新问题,而不是简单地编辑这个问题。好的,我会的,只是不想问太多问题。这是新问题。如果你愿意回答,那就太好了,谢谢。或者其他人可能会这样做,或者我自己可能会给出答案。在发布之前检查mediaPlayer是否为null:if(mediaPlayer!=null)mediaPlayer.release();