Обратный вызов списка событий Exo Player

в onPause() активности я передаю false в player.setPlayerWhenReady(), я нажимаю кнопку «Домой» телефона, поэтому вызывается onPause() активности, но я держу приложение в фоновом режиме, я не удаляю из стека, примерно через 20 минут я повторно открыть приложение, поэтому было вызвано onStart() активности, где снова инициализируйте exoplayer, и я передаю действительный URL-адрес видео, затем я передаю player.setPlayerWhenReady(true), но exo player напрямую вызывает onPlayerError() в своем обратном вызове.. но когда я закрываю приложение из стека и снова открыть приложение exo player работает нормально ... пожалуйста, помогите решить эту проблему.

код такой..

            simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view);
            simpleExoPlayerView.requestFocus();

            TrackSelection.Factory videoTrackSelectionFactory =
                    new AdaptiveTrackSelection.Factory(bandwidthMeter);

            trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

            player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
            Log.d(AppConstants.LOG_TAG_LOG, "initializePlayer: player instance in initializePlayer is ="+player);
            simpleExoPlayerView.setPlayer(player);
            Log.d(AppConstants.LOG_TAG_LOG, "initializePlayer: shouldAutoPlay is ="+shouldAutoPlay);
            player.setPlayWhenReady(true);


            DefaultExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
            MediaSource mediaSource = new ExtractorMediaSource(Uri.parse(url), mediaDataSourceFactory,
                    extractorsFactory, null, null);

            durationSet = false;
            player.prepare(mediaSource);
            seekToValue = scSchedule.getSeekPosition();
            if (seekToValue != null) {
                player.seekTo(seekToValue);
            } else {
                player.seekTo(0);
                seekToValue = 0L;
            }
            player.addListener(new Player.EventListener() {
                @Override
                public void onTimelineChanged(Timeline timeline, Object manifest) {

                }

                @Override
                public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

                }

                @Override
                public void onLoadingChanged(boolean isLoading) {

                }

                @Override
                public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                    if (playbackState == ExoPlayer.STATE_ENDED) {
                        Log.d(AppConstants.LOG_TAG_LOG,
                                "In FullScreenVideoActivity::onPlayerStateChanged() ");
                        // increment videoViewCount in Analytics table
                        AppUtils.getInstance().updateAnalytics(false,
                                -1, true);
                        // update video watched duration in Analytics table
                        int videoViewDuration = 0;
                        if (seekToValue != null) {
                            if (filmDuration > seekToValue) {
                                videoViewDuration = (int) (filmDuration - seekToValue);
                                AppUtils.getInstance().updateAnalytics(false,
                                        videoViewDuration / 1000,
                                        false);
                            }
                        }
                        isVideoEnded = true;
                        videoEnded();
                        finish();
                    } else if (playbackState == ExoPlayer.STATE_READY && !durationSet) {
                        filmDuration = (int) player.getDuration();
                        Log.d(AppConstants.LOG_TAG_LOG,
                                "In FullScreenVideoActivity::onPlayerStateChanged(), " +
                                        "filmDuration = " + filmDuration);
                        durationSet = true;
                    }
                }

                @Override
                public void onRepeatModeChanged(int repeatMode) {

                }

                @Override
                public void onPlayerError(ExoPlaybackException error) {
                    Log.d(AppConstants.LOG_TAG_LOG,"onPlayerError() called");
                }

                @Override
                public void onPositionDiscontinuity() {

                }

                @Override
                public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

                }
            });

   private void releasePlayer() {
        if (player != null) {
            shouldAutoPlay = player.getPlayWhenReady();
            player.release();
            player = null;
            trackSelector = null;
        }
    }

я вызываю этот метод выпуска в onDestroy() активности.


person kuldeep zala    schedule 04.01.2018    source источник


Ответы (1)


Проблема может заключаться в том, что вы снова инициализируете Exoplayer, не выпуская его сначала. Обычно хорошей практикой является отпускать проигрыватель в onPause как:

private void releasePlayer() {
        if (player != null) {
            playbackPosition = player.getCurrentPosition();
            currentWindow = player.getCurrentWindowIndex();
            playWhenReady = player.getPlayWhenReady();
            player.release();
            player = null;
        }
    }

А потом в onStart можно инициализировать плеер с параметрами, откуда ушел пользователь.

private void initializePlayer() {
        if (player == null) {
            player = ExoPlayerFactory.newSimpleInstance(
                    new DefaultRenderersFactory(this),
                    new DefaultTrackSelector(), new DefaultLoadControl());

            playerView.setPlayer(player);
            player.setPlayWhenReady(playWhenReady);
            player.seekTo(currentWindow, playbackPosition);
            Uri uri = Uri.parse(getString(R.string.media_url_mp3));
            MediaSource mediaSource = buildMediaSource(uri);
            player.prepare(mediaSource, true, false);
        }

P.S. Код не имеет отношения к вашему. Это просто пример.

person rS_    schedule 04.01.2018
comment
я выпускаю плеер в соответствии с рекомендациями Exo player, он успешно выпускает плеер, но проблема в другом, когда я снова открываю приложение, я инициализирую плеер даже после инициализации плеера и предоставления рабочего URL-адреса видео, плеер выдает ошибку, он вызывает onPlayerError () напрямую. - person kuldeep zala; 04.01.2018
comment
Поскольку вы упомянули, что вы вызываете метод выпуска в onDestroy, я предлагаю вам попробовать вызвать releasePlayer в onPause, если Util.SDK_INT <= 23 .. Или в onStop, если Util.SDK_INT>23 - person rS_; 04.01.2018