Как воспроизвести следующую случайную песню из массива песен

У меня есть массив песен. Мое приложение воспроизводит песни случайным образом, когда активность открыта, но когда песня закончена, я хотел бы воспроизвести другую случайную песню из массива, кто-нибудь может помочь с этим?

public MediaPlayer mediaPlayer;
private int songs[];


songs = new int[] {
    R.raw.track1,
    R.raw.track2,
    R.raw.track3,
    R.raw.track4,
    R.raw.track5,
    R.raw.track6,
    R.raw.track7,
    R.raw.track8,
    R.raw.track9,
    R.raw.track10,
    R.raw.track11,
    R.raw.track12,
    R.raw.track13,
    R.raw.track14,
    R.raw.track15,
    R.raw.track16,
    R.raw.track17,
};


int randomSong =  new Random().nextInt(songs.length);
mediaPlayer = MediaPlayer.create(this, songs[randomSong]);
mediaPlayer.start();

person djalmafreestyler    schedule 28.12.2017    source источник
comment
в чем проблема с кодом, который у вас есть?   -  person Vivek Mishra    schedule 28.12.2017


Ответы (3)


Попробуйте это, вам нужно реализовать интерфейс MediaPlayer.OnCompletionListener в своей деятельности.

public class MainActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener {
    private MediaPlayer mediaPlayer;
    private int songs[];
    private int randomSong;
    private Random random = new Random();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mediaPlayer.setOnCompletionListener(this);
        songs = new int[]{
                R.raw.track1,
                R.raw.track2,
                R.raw.track3,
                R.raw.track4,
                R.raw.track5,
                R.raw.track6,
                R.raw.track7,
                R.raw.track8,
                R.raw.track9,
                R.raw.track10,
                R.raw.track11,
                R.raw.track12,
                R.raw.track13,
                R.raw.track14,
                R.raw.track15,
                R.raw.track16,
                R.raw.track17,
        };


        randomSong = getRandom(songs);
        mediaPlayer = MediaPlayer.create(this, songs[randomSong]);
        mediaPlayer.start();
    }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        randomSong = getRandom(songs);
        mediaPlayer = MediaPlayer.create(this, songs[randomSong]);
        mediaPlayer.start();
    }

    public int getRandom(int[] array) {
        return random.nextInt(array.length);
    }
}
person Abhay Tomar    schedule 28.12.2017
comment
OP уже использует случайную функцию - person Vivek Mishra; 28.12.2017
comment
использование нового объекта Random каждый раз при вызове метода - плохая идея - person O.O.Balance; 28.12.2017
comment
Спасибо, что указали. я отредактировал свой ответ - person Abhay Tomar; 28.12.2017
comment
@Abhay У вас есть, но вы все еще создаете новые случайные объекты. Добавьте Random random = new Random() в качестве члена MainActivity и используйте его вместо этого. - person O.O.Balance; 28.12.2017
comment
Спасибо за ответ, но это не работает, после того, как песня закончена, следующая случайная песня не воспроизводится. Нужно ли вызывать метод OnCompletion внутри onCreate? @Абхай Томар - person djalmafreestyler; 28.12.2017
comment
@djalmafreestyler вам нужно установить onCompletionListener как в onCreate(), так и в onCompletion(): mediaPlayer.setOnCompletionListener(this); - person O.O.Balance; 28.12.2017
comment
@ O.O.Balance, ты прав. и спасибо, что указали. Я отредактировал ответ. @djalmaffreestyler просто напишите mediaPlayer.setOnCompletionListener(this); внутри вашего метода onCreate(). - person Abhay Tomar; 01.01.2018
comment
@AbhayTomar Извините, я не вижу изменений - ваш код по-прежнему создает новые объекты Random в двух местах. - person O.O.Balance; 01.01.2018
comment
@O.O.Balance Проверьте это сейчас - person Abhay Tomar; 02.01.2018
comment
@AbhayTomar в вашем методе getRandom() вы создаете экземпляр нового объекта Random каждый раз, когда он вызывается. Введение int randomSong не имеет значения. Вместо этого объявите частный Random random, инициализируйте его один раз и используйте каждый раз в getRandom(). - person O.O.Balance; 02.01.2018
comment
Применил изменения, спасибо @O.O.Balance - person Abhay Tomar; 02.01.2018


Вы можете использовать прослушиватель для запуска обратного вызова, когда песня закончила играть:

setOnCompletionListener(MediaPlayer.OnCompletionListener listener)

Кроме того, чтобы обеспечить случайность, я настоятельно рекомендую не использовать новый объект Random каждый раз, когда вам нужно случайное число. Вместо этого объявите переменную random и используйте ее для всех ваших нужд случайности.

person O.O.Balance    schedule 28.12.2017