【问题标题】:Keep Google Cast receiver alive and/or sender connected保持 Google Cast 接收器处于活动状态和/或发送器连接
【发布时间】:2018-03-16 22:48:53
【问题描述】:

我正在为需要执行两项任务的商店编写 Cast 应用程序:

  • 在背景中展示一些广告(静态图片)(可能带有平滑的图片过渡);
  • 在角落显示“我们正在服务”号码。

我已经开发了应用程序(自定义接收器和 Android 发送器)。广告由服务器提供,因此嵌入到接收方应用程序中,而发送方应用程序用于控制“我们正在服务”号码。

一切都像魅力一样,但几分钟后,发送者断开连接,接收者退出,屏幕上留下谷歌 Chromecast 背景图像。

虽然我可以接受发送方断开连接(即使我想避免它),但接收方应用退出是不可接受的。

我尝试通过 CastSession.sendMessage() 发送保持活动消息,但没有成功。

我曾想过在隐藏的 cast-media-player 中播放一些内容,以欺骗它以为我在播放某些东西,但我认为这是一个相当肮脏的解决方案。

是否有可能以更好的方式实现我想要做的事情?

【问题讨论】:

    标签: android google-cast


    【解决方案1】:

    更简单的解决方案是在传递给 CastReceiverContext.start() 的 CastReceiverOptions 中设置 disableIdleTimeout: true。这将使您的接收器保持运行。

    示例(内联构造 CastReceiverOptions 的代码):

    const context = cast.framework.CastReceiverContext.getInstance(); ... context.start({disableIdleTimeout: true});

    【讨论】:

      【解决方案2】:

      我对此问题进行了进一步调查,发现问题在于接收方的播放器处于空闲状态的时间过长,因此关闭了应用程序以及与发送方的任何连接。

      AFAIK,没有办法以干净的方式避免这种行为,所以我选择了肮脏的解决方案。我在接收器中放置了一个隐藏的cast-media-player,然后向它发送了一个不存在的图像。它尝试加载图像(进入状态 BUFFERING),但失败了。以这种方式它重置了空闲计时器并且应用程序不再退出。

      我希望这对以后的其他人有所帮助。

      编辑:添加了更长的解释

      为了解决这个问题,我不得不添加 cast-media-player 标签并通过接收器应用程序中的 CSS 隐藏它:

      <head>
          <style>
              cast-media-player {
                  display: none;
              }   
          </style>
      </head>
      <body>
          <!-- My content -->
          <cast-media-player></cast-media-player>
      </body>
      

      之后,我向 Android 发送应用程序添加了一个循环,该循环每 30 秒(即使超时时间更长也可能会起作用)要求播放器显示给定图像:

      private void playFakeContent() {
          final String addr = "http://your.domain.here/404image.png"; 
      
          CastSession session = mSessionManager.getCurrentCastSession();
          if (null != session) {
              MediaInfo.Builder builder = new MediaInfo.Builder(addr)
                          .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
                          .setContentType("image/png")
                          .setMetadata(new MediaMetadata(MediaMetadata.MEDIA_TYPE_PHOTO));
              session.getRemoteMediaClient().load(builder.build(), true);
          }
      }
      

      我还在前台的应用程序上放置了一项服务,以确保 Android 不会杀死我手机上的应用程序。

      可能应该有一些改进的空间,例如在给定的时间内播放实际图像以避免无用的 HTTP 请求,并且 Player 状态的侦听器仅在图像进入 IDLE 状态时才请求图像,但是我现在没有足够的时间尝试它。 如果我愿意,我会更新我的答案。

      我目前无法分享完整的应用程序代码,但我打算将来在 GitHub 上发布它。项目准备就绪后,我会立即更新我的答案。

      【讨论】:

      • 我还在自定义接收器中呈现自定义内容(隐藏/忽略接收器播放器)并希望保持连接有效。您能否分享有关您的解决方法 Andrea 的更多详细信息?您是否尝试加载一次不存在的图像,这足以让一切无限期地保持活力?您是否必须定期尝试加载不存在的图像?如果定期,您是否从发送者发送这些请求或处理接收者中的所有内容?你能和我们分享你的代码吗?
      • 很遗憾,我无法复制您的结果 Andrea。我正在使用 iOS Cast SDK,但翻译您发布的调用非常容易。我已经完成了 3 周的任务,这是释放辛勤工作的最后障碍。你有什么可以分享的可以帮助我吗?接收代码?接收器控制台输出,所以我知道我的应该是什么样子?感谢您提供的所有帮助
      • 提出了一个问题,以防你也想插话 Andrea :) stackoverflow.com/questions/46673152/…
      【解决方案3】:

      看看

      cast.framework.CastReceiverOptions.maxInactivity

      【讨论】:

        猜你喜欢
        • 2012-01-03
        • 2021-09-13
        • 2013-08-27
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        • 2013-01-27
        • 1970-01-01
        相关资源
        最近更新 更多