Изменения состояния Android MediaPlayer - PullRequest
2 голосов
/ 16 июня 2011

Надеюсь, это не глупый вопрос, так как я довольно новичок в Android, но у меня возникают проблемы при обработке изменений состояния с MediaPlayer.Медиаплеер отлично работает на экране и продолжает воспроизводить звук, пока экран не виден, но когда я возвращаюсь к действию и пытаюсь остановить медиаплеер, он не остановится.В любом случае я не вижу, чтобы получить идентификатор потока из mp, который я мог бы сохранить и восстановить на onPause и onResume.Там должно быть что-то простое, что я скучаю.Вот некоторые фрагменты того, что у меня есть:

    public class Noise extends Activity {
       public MediaPlayer mp;

     public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layour.main);

        Button startButton = (Button)findViewById(R.id.startButton);
        Button stopButton = (Button)findViewById(R.id.stopButton);

        mp = MediaPlayer.create(this, R.raw.noise);

        startButton.setOnClickListener(new OnClickListener(){
             @Override
             public void onClick(View v){
                 playSoundLoop();
                 }
               });

        stopButton.setOnClickListener(new OnClickListener(){
             @Override
             public void onClick(View v){
                 stopSound();
                 }
               });
       }

    public void playSoundLoop(){
         mp.setLooping(true);
         mp.start();
     }

    public void stopSound(){
         mp.pause();
         //Had originally tried mp.stop, mp.reset, mp.prepare, but that didn't work any better
     }

}

1 Ответ

2 голосов
/ 16 июня 2011

Я не думаю, что вы освобождаете оригинальный экземпляр MediaPlayer.Таким образом, когда вы покидаете действие и возвращаетесь, onCreate() вызывается снова, и вы получаете два экземпляра, пока из-за нехватки памяти старое освобождается.

Простое решение - освободить его, когда ваша активностьоставляет на переднем плане, например:

@Override
    onPause() {
    mp.release();
    super.onPause();
}

Однако, если вы хотите, чтобы ваша музыка продолжала воспроизводиться в фоновом режиме, вам нужно переместить ссылку MediaPlayer куда-нибудь за пределы жизненного цикла Activity - возможно, в службу.

...