Как правильно выпустить Android MediaPlayer

Я пытаюсь добавить кнопку в свое приложение для Android, где она воспроизводит MP3 при нажатии кнопки. Я получил его работу, но без возможности выпуска объекта mediaPlayer - поэтому он продолжает играть даже после того, как я покинул активность. Если я инициализирую объект MediaPlayer вне метода response() (что вызывается при нажатии кнопки), это заставляет приложение принудительно закрываться при открытии активности. Но если я инициализирую MediaPlayer в методе реакции(), я не могу использовать mplayer.release в методе onQuit(). Что я не вижу здесь?

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

Заставляет его принудительно закрыть.

Update: Вот весь класс 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;
}

}

Я думаю, что он делает это относительно самоочевидно. Когда он вызывается, он отображает текст и кнопку, когда при нажатии начинается воспроизведение. Когда кто-то нажимает кнопку "Назад", он должен вернуться к предыдущему действию и остановить запись. Спасибо, что помогли мне!

Ответ 1

Вы не можете инициализировать объект 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;
}

Кроме того, я рекомендую читать в область видимости переменной в Java.

Ответ 2

Это хорошо работает для меня.

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