Я работаю над приложением Android для потокового радио ... У меня есть массив с 4 треками, когда я достигаю конца списка, думаю, что следующая кнопка будет представлять "последнюю песню", но это не так, и приложение вылетает ,

Вот код кнопки:

    counter=0;

    mediaPlayer=new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    btn_next.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v) {
             if (counter < songurl.length) {
                 counter = counter + 1;
                 textview.setText(songurl[counter]);
                 try {
                     mediaPlayer.reset();
                 } catch (Exception ex) {
                     try {
                         mediaPlayer.setDataSource(songurl[counter]);
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                     try {
                         mediaPlayer.prepare();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                     mediaPlayer.start();
                 }
             } else {

                 Toast.makeText(MainActivity.this, "last song", Toast.LENGTH_SHORT).show();
             }
         }
    });

Еще один вопрос ... если я хочу сделать замкнутый цикл, когда приложение достигнет последней песни, и я хочу нажать «Далее», чтобы начать список с самого начала, как я могу это сделать? Спасибо.

1
KamelK 1 Сен 2017 в 13:27

4 ответа

Лучший ответ

Вы можете просто добавить оператор по модулю (%) в свой код

counter = counter++ % songurl.length

Нет необходимости добавлять дополнительный блок if else

btn_next.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        counter = counter++ % songurl.length
        textview.setText(songurl[counter]);
        try {
            mediaPlayer.reset();
        } catch (Exception ex) {
            try {
                mediaPlayer.setDataSource(songurl[counter]);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.start();
        }

    }
});
3
Neeraj Jha 1 Сен 2017 в 10:56

Одна из проблем, с которой вы столкнулись, заключается в том, что вы увеличиваете счетчик сразу после того, как проверяете, что он находится в допустимых пределах, что означает, что проверка безопасности бесполезна. Переместить counter = counter + 1; в конец оператора if.

Чтобы сделать цикл непрерывным, вы можете изменить его на counter = (counter + 1) % songurl.length; в конце тела оператора if.

Помимо объема вопроса, который вы задали, существуют некоторые проблемы с использованием MediaPlayer. Нет смысла иметь так много ключевой логики в операторе catch. Это означает, что вы ожидаете, что произойдет исключение. Вы должны переосмыслить то, что вы там делаете.

0
Dave 1 Сен 2017 в 10:48

Вы видите, что вы назвали mediaPlayer.setDataSource (songurl [counter]) в блоке catch. Что делать, если оно не будет иметь исключение при вызове mediaPlayer.reset ()

Попробуй это:

try{
    mediaPlayer.reset();
    mediaPlayer.setDataSource();
    mediaPlayer.prepareAsync();--or mediaPlayer.prepare();
    (It depends on whether you load the url on the internet)
    mediaPlayer.start(); -- if you call mediaPlayer.prepareAsync() you should call mediaPlayer.start() at the OnPreparedListener;

 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });
}

И если вам все еще интересно, я предлагаю вам прочитать кое-что о состоянии MediaPlay.

PS Если MediaPlayer воспроизводится, и вы хотите, чтобы он воспроизводил другой, сначала вызовите mediaPlayer.stop ();

0
Jerry.L 1 Сен 2017 в 10:51

Чтобы сделать цикл, вы должны проверить в onclicklistener, что если счетчик равен songurl.length, который, я думаю, общее количество песни в списке воспроизведения.

int counter=0;

    MediaPlayer mediaPlayer=new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    btn_next.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            if (counter < songurl.length) {
                counter = counter + 1;
                textview.setText(songurl[counter]);
                try {
                    mediaPlayer.reset();
                } catch (Exception ex) {
                    try {
                        mediaPlayer.setDataSource(songurl[counter]);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.start();
                }
            } else if(counter == songurl.length) {

                counter = 0;
               // Toast.makeText(MainActivity.this, "last song", Toast.LENGTH_SHORT).show();
                textview.setText(songurl[counter]);
                try {
                    mediaPlayer.reset();
                } catch (Exception ex) {
                    try {
                        mediaPlayer.setDataSource(songurl[counter]);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.start();
                }
            }
        }
    });

В состоянии elseif я установил счетчик на 0., чтобы он попадал в цикл.

-1
Aman Verma 1 Сен 2017 в 10:41