Mediaplayer - останавливать текущий звук при нажатии на новый звук - PullRequest
0 голосов
/ 08 ноября 2018

Я новичок в Android Studio (программирование в целом), но я хочу создать медиаплеер для учебных целей.

У меня есть список местной музыки в listView, который содержит 2 изображения «кнопка воспроизведения, паузы и остановки».

Вот как работает мое приложение:

  • Нажмите на кнопку воспроизведения -> начать музыку
  • Нажмите на кнопку паузы -> пауза музыки
  • Нажмите на кнопку остановки -> остановить музыку

Очень просто. НО! дело в том -> когда я приостанавливаю песню и хочу воспроизвести другую песню в моем списке, она просто возобновляет первую песню, на которую я нажал.

Я хочу, чтобы она выпустила первую песню и запустила другую, на которую я нажал.

Это мой код:

// play music
    viewHolder.playB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (flag) {
                //get song you clicked on
                mediaPlayer = MediaPlayer.create(context, song.getSong());

                //set boolean to false so it can get ANOTHER song when 
                //clicked
                flag = false;
                Toast.makeText(context, "Playing" + song.getName(), 
                Toast.LENGTH_LONG).show();
            }
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
                viewHolder.playB.setImageResource(R.drawable.play);
            } else {
                mediaPlayer.start();
                viewHolder.playB.setImageResource(R.drawable.pause);
            }
        }
    });

    // stop
    viewHolder.stopB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!flag) {
                mediaPlayer.stop();
                mediaPlayer.release();
                flag = true;
            }
            viewHolder.playB.setImageResource(R.drawable.play);
        }
    });

1 Ответ

0 голосов
/ 08 ноября 2018

Ваша логика немного ошибочна. Когда вы создаете MediaPlayer, вы устанавливаете flag на false и до тех пор, пока вы не остановите воспроизведение, flag не изменится. Но от этого зависит твое создание MediaPlayer.

Для будущих улучшений (возможно, когда вы будете более уверенно работать с MediaPlayer и Android), вам следует взглянуть на более «самодельный» подход вместо MediaPlayer.create(...), потому что этот метод вызывает метод prepare() MediaPlayer это в конечном итоге приведет к замедлению работы вашего приложения или его падению при загрузке больших файлов.

Пример по комментариям
Я предположил, что song будет объектом класса.

// class variable will hold the currently loaded song
private Song mCurrentSong;

[...]

viewHolder.playB.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        // MediaPlayer has not been initialized OR clicked song is not the currently loaded song
        if (mCurrentSong == null || song != mCurrentSong) {

            // Sets the currently loaded song
            mCurrentSong = song;
            mediaPlayer = MediaPlayer.create(context, song.getSong());

            Toast.makeText(context, "Playing" + song.getName(), 
            Toast.LENGTH_LONG).show();
        }

        if (mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
            viewHolder.playB.setImageResource(R.drawable.play);
        } else {
            mediaPlayer.start();
            viewHolder.playB.setImageResource(R.drawable.pause);
        }
    }
});

viewHolder.stopB.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        // If currently loaded song is set the MediaPlayer must be initialized
        if (mCurrentSong != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mCurrentSong = null; // Set back currently loaded song
        }
        viewHolder.playB.setImageResource(R.drawable.play);
    }
});
...