【问题标题】:How to receive status updates from Cast Device如何从 Cast Device 接收状态更新
【发布时间】:2014-08-04 07:06:29
【问题描述】:

我为我的 Android 音频流应用程序开发了与 Chromecast 的集成。对于接收器,我使用 Chromecast developer page 中描述的 Styled Media Receiver。大多数情况下一切正常,但是,在播放期间我没有收到来自 Cast 设备的 onStatusUpdated() 调用。当我启动媒体流时,它会开始播放并使用 IDLE MediaStatus 发送状态更新。一旦它开始播放,我就会收到一个带有 PLAYING MediaStatus 的 onStatusUpdated() 调用。在此之后,我没有收到任何更新,这意味着我无法使用音频剪辑的当前搜索位置更新我的应用程序 UI。

为了解决这个问题,我基本上每次获得 PLAYING MediaStatus 时都会运行 Runnable。这是伪代码:

public void onStatusUpdated() {
    ...
    if (mMediaStatus == MediaStatus.PLAYER_STATE_PLAYING) {
        mHandler.postDelayed(mUpdateProgressRunnable, 1000);
        ...

}

mUpdateProgressRunnable = new Runnable() {
    @Override
    public void run() {
        if (mRemoteMediaPlayer != null && mApiClient != null) {
            mRemoteMediaPlayer.requestStatus(mApiClient);
        }
    }
}

这是正确的方法吗?为什么接收器不自己发送更新?这似乎工作正常,但令我惊讶的是,我无法在网上找到任何有关正确方法的信息。

感谢任何帮助!谢谢。

【问题讨论】:

    标签: android chromecast


    【解决方案1】:

    您需要有一个线程来更新搜索栏。但是您不需要为视频中的当前位置显式地执行 requestStatus 。你应该打电话给

    RemoteMediaPlayer.getApproximateStreamPosition
    

    这是由 Cast SDK 管理的,是一种跟上接收器上的媒体播放进度的有效方式。

    【讨论】:

    • 如果你使用的是CCL,你可以使用VideoCastManager. getCurrentMediaPosition()来代替。
    • 谢谢!打算将此标记为不久前已回答。
    【解决方案2】:

    https://github.com/googlecast/CastCompanionLibrary-android/blob/master/src/com/google/sample/castcompanionlibrary/cast/VideoCastManager.java

    该 CCL 类的第 851 行具有 Cast.Listener 的实现,可用于对远程播放器上发出的状态事件做出反应。我认为您必须将 CCL 置于调试模式才能获得在“PLAY”期间发生的如下记录器输出:

    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 2 0
    I/System.out( 2765): status: playing
    D/ccl_MyVideoCastManager( 2765): updateMiniControllersVisibility() reached with visibility: true
    D/ccl_VideoCastControlle( 2765): onRemoteMediaPlayerStatusUpdated(), status: 2
    D/ccl_VideoCastNotificat( 2765): onRemoteMediaPlayerMetadataUpdated() reached with status: 2
    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 4 0
    I/System.out( 2765): status: buffering
    D/ccl_MyVideoCastManager( 2765): updateMiniControllersVisibility() reached with visibility: true
    D/ccl_VideoCastControlle( 2765): onRemoteMediaPlayerStatusUpdated(), status: 4
    D/ccl_VideoCastNotificat( 2765): onRemoteMediaPlayerMetadataUpdated() reached with status: 4
    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 2 0
    I/System.out( 2765): status: playing
    D/ccl_MyVideoCastManager( 2765): updateMiniControllersVisibility() reached with visibility: true
    D/ccl_VideoCastControlle( 2765): onRemoteMediaPlayerStatusUpdated(), status: 2
    D/ccl_VideoCastNotificat( 2765): onRemoteMediaPlayerMetadataUpdated() reached with status: 2
    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 4 0
    I/System.out( 2765): status: buffering
    D/ccl_MyVideoCastManager( 2765): updateMiniControllersVisibility() reached with visibility: true
    D/ccl_VideoCastControlle( 2765): onRemoteMediaPlayerStatusUpdated(), status: 4
    D/ccl_VideoCastNotificat( 2765): onRemoteMediaPlayerMetadataUpdated() reached with status: 4
    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 2 0
    I/System.out( 2765): status: playing
    D/ccl_MyVideoCastManager( 2765): updateMiniControllersVisibility() reached with visibility: true
    D/ccl_VideoCastControlle( 2765): onRemoteMediaPlayerStatusUpdated(), status: 2
    D/ccl_VideoCastNotificat( 2765): onRemoteMediaPlayerMetadataUpdated() reached with status: 2
    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 4 0
    I/System.out( 2765): status: buffering
    D/ccl_MyVideoCastManager( 2765): updateMiniControllersVisibility() reached with visibility: true
    D/ccl_VideoCastControlle( 2765): onRemoteMediaPlayerStatusUpdated(), status: 4
    D/ccl_VideoCastNotificat( 2765): onRemoteMediaPlayerMetadataUpdated() reached with status: 4
    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 2 0
    I/System.out( 2765): status: playing
    D/ccl_MyVideoCastManager( 2765): updateMiniControllersVisibility() reached with visibility: true
    D/ccl_VideoCastControlle( 2765): onRemoteMediaPlayerStatusUpdated(), status: 2
    D/ccl_VideoCastNotificat( 2765): onRemoteMediaPlayerMetadataUpdated() reached with status: 2
    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 4 0
    I/System.out( 2765): status: buffering
    D/ccl_MyVideoCastManager( 2765): updateMiniControllersVisibility() reached with visibility: true
    D/ccl_VideoCastControlle( 2765): onRemoteMediaPlayerStatusUpdated(), status: 4
    D/ccl_VideoCastNotificat( 2765): onRemoteMediaPlayerMetadataUpdated() reached with status: 4
    D/dalvikvm(  753): GC_EXPLICIT freed 967K, 7% free 27480K/29484K, paused 1ms+3ms, total 85ms
    D/ccl_MyVideoCastManager( 2765): RemoteMediaPlayer::onStatusUpdated() is reached
    D/ccl_MyVideoCastManager( 2765): onRemoteMediaPlayerStatusUpdated() reached 2 0
    

    如果你想继续,那就去 git 并获取一个使用像“VideoCast”这样的 CCL 的 android sender 示例并对其进行调试。您将看到堆栈中围绕状态更改和此类通知的重要部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2017-05-25
      • 1970-01-01
      • 2018-12-20
      • 2014-08-24
      • 2021-02-26
      • 2020-09-11
      相关资源
      最近更新 更多