在断开投射之前获取媒体当前位置

Get media current position before disconnecting from cast

是否可以在断开与演员表的连接之前从 VideoCastManager 获取当前正在播放的媒体?

我想在用户手动断开投射时保存当前媒体的最后进度。我使用了 VideoCastCosumer 方法 onDisconnected() 但它抛出异常。不确定是哪种异常,因为我的日志只显示了这个:

System.err: at com.economist.newton.mobile.ui.activity.BaseCastActivity.onDisconnected (MyCastActivity.java:81)

此行包含 onDisconnected() 方法中的以下行:

try {
      if(castManager.getCurrentMediaPosition() > 30000){ //  <-here error occurs
              ...
      }
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
      e.printStackTrace();
}

如果有帮助,castManager 变量声明在 onCreate():

castManager = VideoCastManager.getInstance();

演员库:com.google.android.libraries.cast.companionlibrary:ccl:2.8.4

有几种方法可以做到这一点。我认为最简单的方法是拥有一个实现 ProgressWatcher(来自 CCL)的组件。在该侦听器中,将每秒调用 setProgress(int currentPosition, int duration) 并将流的 currentPosition 作为其第一个参数。您可以缓存此值(如果您的设备断开连接,它不会更新)以便为您提供有关当前位置的实时信息。例如,如果您的 activity 实现了这个接口:

public MyActivity extends AppCompatActivity implements ProgressWatcher {
   private int mCurrentStreamPosition;

   public onStart() {
       ....
       mCastManager.addProgressWatcher(this);
       ....
   }

   public onStop() {
       ....
       mCastManager.removeProgressWatcher(this);
       ....
   }

   public setProgress(int currentTime, int duration) {
       mCurrentStreamPosition = currentTime;
   }

   public int getCurrentStreamPosition() {
       return mCurrentStreamPosition;
   }
   ....
}

因此,您可以随时调用 getCurrentStreamPosition()(例如,您可以在 onDisconnected() 中调用它)来获取 last/current 流位置。请注意,根据您应用的结构,您可以决定 register/unregister 您的 ProgressWatcheronResume()/onPause()onCreate()/onDestroy() 中。重要的是确保注销它以避免内存泄漏。

对于 Castv3,您可以从 SessionManagerListener 覆盖 onSessionEnding 并获得 mRemoteMediaClient.getMediaStatus().getStreamPosition()

呼叫 mRemoteMediaClient.getMediaStatus().getStreamPosition() 对我不起作用,但 mRemoteMediaClient.getApproximateStreamPosition() 工作正常。