Невозможно получить следующую песню для воспроизведения после onCompleteListener - PullRequest
0 голосов
/ 14 мая 2019

Я прочитал множество различных ответов по этому вопросу, но я просто хотел уточнить одну вещь о методе onCompletionListener для MediaPlayer.У меня есть конфигурация, которая в настоящее время работает и воспроизводит песню после того, как она завершит первую, но после окончания второй она не будет воспроизводить другую песню из массива.Также не будут отображаться метаданные для новой дорожки.Я предполагаю, что onCompletionListener запускается только один раз и не переносится во вновь созданный экземпляр MediaPlayer.Подробнее Конкретный ответ, который я ищу: может ли onCompleteListener запускаться более одного раза?Или это нецикличная функция?

Видео, демонстрирующее проблему: https://youtu.be/WXDtCktTh3M

Вот что у меня есть для моего блока слушателя:

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer arg0) {
                if (chosenPath == null) {
                    seekBar.setProgress(0);
                    mediaPlayer.seekTo(0);
                } else {
                    songOrderCounter += 1;
                    System.out.println("SONG_ITERATOR_COUNT: " + songOrderCounter);
                    try {
                        /*handler.removeCallbacks(moveSeekBarThread);
                        songUpdateTimeHandler.removeCallbacks(updateSongTime);*/
                        Log.d("PATH_WORKING", allMusicFiles[songOrderCounter].toString());
                        mediaPlayer.stop();
                        mediaPlayer.reset();
                        mediaPlayer.release();
                        mediaPlayer = new MediaPlayer();
                        mediaPlayer.setDataSource(allMusicFiles[songOrderCounter].toString());
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                mediaPlayer.start();
                                metaRetriever();
                                seekBar.setProgress(0);
                            seekBar.setMax(mediaPlayer.getDuration());
                            trackTime();
                            }
                        });
                        mediaPlayer.prepareAsync();
                        metaRetriever(); /* Moved inside onPrepared*/


                    } catch (Exception e) {
                        System.out.println("NEXT_SONG_FAILED: " + e);
                    }
                }
            }
        });

ОБНОВЛЕНИЕ

Причина, по которой это не работает, заключается в том, что я создал новый экземпляр MediaPlayer в функции onCompletion (), чтобы слушатель не связывался с вновь созданным экземпляром MediaPlayer.Поэтому он не будет прослушивать завершение недавно созданного MediaPlayer.Я удалил новый раздел кода MediaPlayer из функции setOnCompleteListener (), и теперь есть проблемы с исполняемыми потоками, которые отслеживают панель поиска и время, приводящее к его падению, когда он достигает конца файла

D/PATH_WORKING: /storage/emulated/0/Music/01 Control.mp3
I/System.out: NEXT_SONG_FAILED: java.lang.IllegalStateException
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.macyg.androidmediaplayer, PID: 12784
    java.lang.IllegalStateException
        at android.media.MediaPlayer.getCurrentPosition(Native Method)
        at com.example.macyg.androidmediaplayer.MainActivity$12.run(MainActivity.java:596)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6077)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

И Runnable, вызывающий сбой:

private Runnable moveSeekBarThread = new Runnable() {
        public void run() {
            if(mediaPlayer.getCurrentPosition() <= mediaPlayer.getDuration()) {
                int mediaPos_new = mediaPlayer.getCurrentPosition();
                int mediaMax_new = mediaPlayer.getDuration();
                seekBar.setMax(mediaMax_new);
                seekBar.setProgress(mediaPos_new);
                handler.postDelayed(this, 100); //Looping the thread after 0.3 second
                // seconds
            }else{}
        }
    };
...