Chromecast SDK (Android) - is there a way to check whether the media playing on the cast device has finished playing?

前端 未结 3 1073
予麋鹿
予麋鹿 2020-12-21 01:31

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条回答
  • 2020-12-21 01:38

    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.

    0 讨论(0)
  • 2020-12-21 01:48

    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: ");
                }
            };
    
    0 讨论(0)
  • 2020-12-21 01:58

    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) {
      ...
    
    }
    
    0 讨论(0)
提交回复
热议问题