Exoplayer воспроизводит новый плейлист с самого начала вместо указанной позиции

Я реализовал DynamicConcatenatingMediaSource в моем проекте и обнаружил ошибку в методе exoPlayer.prepare(source); песни начинают воспроизводиться в начале списка воспроизведения до exoPlayer.seekTo(currentPosition, C.TIME_UNSET); называется Так что это вызывает ошибку пользовательского интерфейса в моем приложении.

Для уже кэшированной песни пользователь может прослушать первую воспроизводимую песню перед переходом к следующей песне.

Я играю песню отсюда и сравниваю, если это новый список, я заново инициализирую exoplayer.

  private BroadcastReceiver playNewAudio = new BroadcastReceiver() {
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onReceive(Context context, Intent intent) {

        if (exoPlayer != null) {
            try {
                if (!exoPlayer.getPlayWhenReady()) {
                    resumeMedia();
                    sendBroadcast(Dispatcher.Broadcast.NEW_TRACK_PLAYING, "");
                    return;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //Get the new media index form SharedPreferences
        if (songManager.currentPosition != -1 && songManager.currentPosition < songManager.getCurrentPlayList().size()) {
            //index is in a valid range
            songManager.activeTrack = songManager.getCurrentPlayList().get(songManager.currentPosition);
            //sendBroadcast(Dispatcher.Broadcast.NEW_TRACK_PLAYING,"");
            if (songManager.getPreviousPlaylist().equals(songManager.currentPlayList))

                seekToCurrent(songManager.currentPosition);

            else
                initExo();
        } else {
            stopSelf();
        }

        /*stopMedia();*/
        if (exoPlayer != null) {
            try {
                exoPlayer.setPlayWhenReady(shouldAutoPlay);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            initExo();
        }
        /*initMediaPlayer();*/
        updateMetaData();
        buildNotification(PlaybackStatus.PLAYING);

    }
};

Здесь я инициализирую Exo

  private void initExo() {
    songManager = SongManager.getInstance();
    int currentPosition = songManager.getCurrentPosition();
    window = new Timeline.Window();
    defaultBandwidthMeter = new DefaultBandwidthMeter();
    LoadControl loadControl = new DefaultLoadControl();

    trackSelectionFactory = new AdaptiveTrackSelection.Factory(defaultBandwidthMeter);

    trackSelector = new DefaultTrackSelector(trackSelectionFactory);

    boolean newExo = exoPlayer == null;

    if (newExo)
        exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);

    exoPlayer.addListener(this);
    source = initMediaSource();
    exoPlayer.prepare(source);
    exoPlayer.seekTo(currentPosition, C.TIME_UNSET);
    exoPlayer.setPlayWhenReady(true);


}

Затем вызов initMediaSource

    private DynamicConcatenatingMediaSource initMediaSource() {
    clearSource();
    DynamicConcatenatingMediaSource mediaSource = new DynamicConcatenatingMediaSource();
    for (Track track : songManager.getCurrentPlayList()) {
        if (track != null && !track.getSource().isEmpty()) {
            HlsMediaSource source = new
                    HlsMediaSource(Uri.parse(track.getSource()), cacheDataSourceFactory(), 5,   null, null);
            mediaSource.addMediaSource(source);
        } else {
            Log.e("Bad_Track", track.toString());
        }
    }
    songManager.setPreviousPlaylist(songManager.currentPlayList);
    return mediaSource;
}

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

0 ответов

Другие вопросы по тегам