5

Is there an onFinished listener of some sort? Or do we have to compare the current stream position against the duration of the track?

3 Answers 3

11

It's not pretty but you can make this call:

if (mRemoteMediaPlayer.getMediaStatus().getPlayerState() ==  MediaStatus.PLAYER_STATE_IDLE
    && mRemoteMediaPlayer.getMediaStatus().getIdleReason() ==  MediaStatus.IDLE_REASON_FINISHED) {
  ...

}
4

Prem, There is currently no callback to register for such event. One alternative (and-not-so-pretty) approach is the following: on the receiver, listen for "ended" event of the media element and send an event back to the sender through a private channel. Another approach is what you suggested: check position against duration. When SDK graduates to general availability, better and cleaner approaches will be available to accomplish what you want.

1
  • Is there any update regarding that?
    – Tara
    Commented Sep 30, 2021 at 7:45
2

Here is solution: You just need to take one more variable mIdleReason.

1) Initialize mIdleReason as

public int mIdleReason=MediaStatus.IDLE_REASON_NONE;

2) Update value at method loadMedia

 public void loadMedia(String url, MediaMetadata movieMetadata, CastSession castSession, boolean autoPlay, long position) {
        if (castSession == null || !castSession.isConnected()) {
            return;
        }
        MediaInfo mediaInfo = new MediaInfo.Builder(url)
                .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
                .setContentType("videos/m3u8")
                .setMetadata(movieMetadata)
                .build();
        mRemoteMediaClient = castSession.getRemoteMediaClient();
        mRemoteMediaClient.addListener(mRemoteMediaClientListener);
        mRemoteMediaClient.load(mediaInfo, autoPlay, position);

        mIdleReason = MediaStatus.IDLE_REASON_NONE;
    }

3) Update value at onStatusUpdate:

 private RemoteMediaClient.Listener mRemoteMediaClientListener = new RemoteMediaClient.Listener() {
            @Override
            public void onStatusUpdated() {
                if (mRemoteMediaClient == null || mediaPlayerListener == null) {
                    return;
                }
                MediaStatus mediaStatus = mRemoteMediaClient.getMediaStatus();

                if (mediaStatus != null) {
                    int playerStatus = mediaStatus.getPlayerState();
                    Log.d("PlayerState", "onStatusUpdated() called, progress= "+mSeekBar.getProgress() +", stream duration= "+ mRemoteMediaClient.getStreamDuration()+" mSeekBar.getProgress() == mRemoteMediaClient.getStreamDuration()="+(mSeekBar.getProgress() == mRemoteMediaClient.getStreamDuration()));
                    Log.d("PlayerState", "onStatusUpdated() called playerStatus="+playerStatus+", idleReason="+mediaStatus.getIdleReason());

 if (playerStatus == MediaStatus.PLAYER_STATE_PLAYING) {
                        mediaPlayerListener.playing();
                        mIdleReason = MediaStatus.IDLE_REASON_FINISHED;
                    } else if (playerStatus == MediaStatus.PLAYER_STATE_BUFFERING) {
                        mediaPlayerListener.buffering();
                        mIdleReason = MediaStatus.IDLE_REASON_FINISHED;
                    } else if (playerStatus == MediaStatus.PLAYER_STATE_PAUSED) {
                        mediaPlayerListener.paused();
                    } else if (playerStatus == MediaStatus.IDLE_REASON_INTERRUPTED) {
                        mediaPlayerListener.error();
                    } else if (playerStatus == MediaStatus.IDLE_REASON_ERROR) {
                        mediaPlayerListener.error();
                    }else if(playerStatus == MediaStatus.PLAYER_STATE_IDLE && mediaStatus.getIdleReason() == MediaStatus.IDLE_REASON_FINISHED&& mIdleReason == MediaStatus.IDLE_REASON_FINISHED){
                        mediaPlayerListener.played();
                    }
                }
            }

            @Override
            public void onMetadataUpdated() {
                Log.d("", "onMetadataUpdated: ");
            }

            @Override
            public void onQueueStatusUpdated() {
                Log.d("", "onQueueStatusUpdated: ");
            }

            @Override
            public void onPreloadStatusUpdated() {
                Log.d("", "onPreloadStatusUpdated: ");
            }

            @Override
            public void onSendingRemoteMediaRequest() {
                Log.d("", "onSendingRemoteMediaRequest: ");
            }

            @Override
            public void onAdBreakStatusUpdated() {
                Log.d("", "onAdBreakStatusUpdated: ");
            }
        };
1
  • The variable mIdleReason is redundant, you don't need it.
    – Billy
    Commented May 21, 2019 at 10:51

Not the answer you're looking for? Browse other questions tagged or ask your own question.