2013-02-23 4 views
10

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

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

} 

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

+0

Если на ваш другой вопрос был дан ответ, и вы хотите задать новый вопрос, вы должны открыть новый вопрос, а не просто отредактировать его. – Geobits

+0

Хорошо, я просто не хочу задавать слишком много вопросов. – dacelbot

+0

Вот новый вопрос. http://stackoverflow.com/questions/15046888/android-mediaplayer-causing-force-close-onquit Если вы чувствуете, что отвечаете, что было бы здорово, спасибо. Или кто-то другой, или я мог бы сам ответить. – dacelbot

ответ

14

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

Кроме того, я рекомендовал бы читать на variable scope in Java.

+0

Ах, спасибо огромное! Это была действительно глупая ошибка. Я понял, что сфера охватила то, с чем у меня были проблемы, но мой мозг не работал, и я не мог придумать, как это исправить. – dacelbot

+0

Итак, я скопировал ваш пример, и теперь он работает нормально, но когда я нажимаю кнопку «Назад» после нажатия кнопки, которая запускает звук, сила приложения закрывается. Есть предположения? – dacelbot

+0

С этим связано множество потенциальных проблем. Я бы предложил задать другой вопрос, объяснив, что вы делаете во всех жизненных циклах (создавать, возобновлять, приостанавливать, останавливать и т. Д.). Также объясните, что именно вы хотите сделать. – Geobits

0

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

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