user5348451
user5348451

Reputation:

Exoplayer and ProgressBar

I'm new to Android Studio and ExoPlayer I started the player to play videos but I don't know to detect if the player is buffering and show a progress bar to notify the user, any help please?

Upvotes: 22

Views: 29701

Answers (8)

Rohit Sharma
Rohit Sharma

Reputation: 167

It is working for me.

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/videoPlayer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:resize_mode="fill"
    app:surface_type="texture_view"
    app:use_controller="true"
    app:show_buffering="always" />

Upvotes: 1

Mohammad Charousaei
Mohammad Charousaei

Reputation: 21

You can simply add app:show_buffering="when_playing" attr in playerView in your xml file

see this for more information https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/ui/PlayerView.html#SHOW_BUFFERING_WHEN_PLAYING

Upvotes: 1

Chirag Prajapati
Chirag Prajapati

Reputation: 55

Now Player.EventListener is deprecated, instead of use Player.Listener

 simpleExoPlayer.addListener(object : Player.Listener {
                            override fun onTracksChanged(
                                trackGroups: TrackGroupArray,
                                trackSelections: TrackSelectionArray
                            ) {
                            }

                            override fun onLoadingChanged(isLoading: Boolean) {}
                            
                            override fun onPlayerStateChanged(
                                playWhenReady: Boolean,
                                playbackState: Int
                            ) {
                                if (playbackState == Player.STATE_BUFFERING) {
                                   
                                } 
                            }

                            override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters) {}
                        })

Upvotes: 1

remain4life
remain4life

Reputation: 1311

Maybe it will be helpful to someone:

<com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/player_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black"
        app:show_buffering="true"/>

you can simply change XML attribute show_buffering if you are using Exoplayer2.

Also see PlayerView.setShowBuffering(PlayerView.ShowBuffering) for more details.

Upvotes: 35

Ardit
Ardit

Reputation: 178

mPlayer.addListener(eventListener);

        Player.EventListener eventListener = new Player.EventListener() {
        @Override
        public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {

        }

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

        }

        @Override
        public void onLoadingChanged(boolean isLoading) {

        }

        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            switch (playbackState) {
                case Player.STATE_ENDED:
                    Log.i("EventListenerState", "Playback ended!");
                    finish();
                    break;
            }
        }

        @Override
        public void onRepeatModeChanged(int repeatMode) {

        }

        @Override
        public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

        }

        @Override
        public void onPlayerError(ExoPlaybackException error) {

        }

        @Override
        public void onPositionDiscontinuity(int reason) {

        }

        @Override
        public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

        }

        @Override
        public void onSeekProcessed() {

        }
    };

Upvotes: 1

Harry .Naeem
Harry .Naeem

Reputation: 1331

Seeing the answers of others, i did it this way. I used ExoPlayer version 2.7.0.

private Player.EventListener eventListener = new Player.EventListener() {

    @Override
    public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {

    }

    @Override
    public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
        //Log.i(TAG,"onTracksChanged");
    }

    @Override
    public void onLoadingChanged(boolean isLoading) {
        //Log.i(TAG,"onLoadingChanged");
    }

    @Override
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
        switch (playbackState) {
            case Player.STATE_ENDED:
                Log.i("EventListenerState", "Playback ended!");
                exoPlayer.setPlayWhenReady(false);
                break;
            case Player.STATE_READY:
                Log.i("EventListenerState", "Playback State Ready!");

                hideProgressBar();
                break;
            case Player.STATE_BUFFERING:
                Log.i("EventListenerState", "Playback buffering");
                showProgressBar();

                break;
            case Player.STATE_IDLE:

                break;

        }
    }

    @Override
    public void onRepeatModeChanged(int repeatMode) {

    }

    @Override
    public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {

    }

    @Override
    public void onPlayerError(ExoPlaybackException error) {

    }

    @Override
    public void onPositionDiscontinuity(int reason) {

    }

    @Override
    public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

    }

    @Override
    public void onSeekProcessed() {

    }
};

Upvotes: 1

Louis Nguyen
Louis Nguyen

Reputation: 345

You should implement ExoPlayer.EventListener and override onPlayerStateChanged() to detect state of playing video progress (STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED)

Upvotes: 12

Firoz Ahmed
Firoz Ahmed

Reputation: 2006

in layout file:

<ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_gravity="center"/>

in player activity:

player.addListener(new ExoPlayer.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_BUFFERING){
                    progressBar.setVisibility(View.VISIBLE);
                } else {
                    progressBar.setVisibility(View.INVISIBLE);
                }
            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {}

            @Override
            public void onPositionDiscontinuity() {}

            @Override
            public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {}
        });

Upvotes: 17

Related Questions