【问题标题】:Chromecast SDK (Android) - is there a way to check whether the media playing on the cast device has finished playing?Chromecast SDK (Android) - 有没有办法检查投射设备上播放的媒体是否已经播放完毕?
【发布时间】:2013-11-07 21:14:25
【问题描述】:

是否有某种 onFinished 监听器?还是我们必须将当前的流位置与曲目的持续时间进行比较?

【问题讨论】:

    标签: android google-cast chromecast


    【解决方案1】:

    它不漂亮,但你可以打这个电话:

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

    【讨论】:

      【解决方案2】:

      Prem, 目前没有回调来注册此类事件。一种替代方法(但不那么漂亮)如下:在接收器上,侦听媒体元素的“结束”事件,并通过私有通道将事件发送回发送者。您建议的另一种方法是:根据持续时间检查位置。当 SDK 全面普及时,将有更好、更简洁的方法来实现您想要的。

      【讨论】:

      • 有什么更新吗?
      【解决方案3】:

      解决方案如下: 你只需要多取一个变量mIdleReason

      1) 将mIdleReason初始化为

      public int mIdleReason=MediaStatus.IDLE_REASON_NONE;
      

      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) 在 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: ");
                  }
              };
      

      【讨论】:

      • 变量mIdleReason是多余的,你不需要它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多