简体   繁体   English

Chromecast SDK(Android) - 有没有办法检查播放设备上播放的媒体是否已播放完毕?

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

Is there an onFinished listener of some sort? 是否有某种onFinished听众? Or do we have to compare the current stream position against the duration of the track? 或者我们是否必须将当前流位置与轨道持续时间进行比较?

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) {
  ...

}

Prem, There is currently no callback to register for such event. Prem,目前没有回调注册此类事件。 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. 当SDK毕业于普遍可用性时,可以使用更好,更清晰的方法来实现您的目标。

Here is solution: You just need to take one more variable mIdleReason . 这是解决方案:您只需mIdleReason使用一个变量mIdleReason

1) Initialize mIdleReason as 1)将mIdleReason初始化为

public int mIdleReason=MediaStatus.IDLE_REASON_NONE;

2) Update value at method loadMedia 2)方法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: 3)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: ");
            }
        };

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM