如何正确发布Android MediaPlayer

我正在尝试在我的Android应用程序中添加一个按钮,当按下按钮时它会播放MP3。 我已经让它工作了,但没有办法释放mediaPlayer对象 – 因此它甚至在我离开活动后仍然继续播放。 如果我在react()方法之外初始化MediaPlayer对象(按下按钮时会调用它),这会导致应用程序在打开活动时强制关闭。 但是如果我在react()方法中初始化MediaPlayer,那么我就不能在onQuit()方法中使用mplayer.release。 我在这里看不到什么?

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对象。 如果这样做,它会尝试使用尚未创建的上下文。 您需要将其声明为类variables(在方法外部),并在其中初始化:

 MediaPlayer mediaPlayer; public void react(View view) { mediaPlayer = MediaPlayer.create(ToBeOrNot.this, R.raw.achord); mediaPlayer.start(); } protected void onStop(){ mediaPlayer.release(); mediaPlayer = null; } 

另外,我建议阅读Java中的variables作用域 。

这对我很有帮助。

 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(); }