Как правильно выпустить 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();
}