保持Google Cast接收器处于活动状态和/或发件人连接

时间:2017-10-05 10:34:52

标签: android google-cast

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

  • 在后台展示一些广告(静态图片)(可能是平滑的图片过渡);
  • 在角落里显示“我们正在服务”号码。

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

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

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

我尝试通过CastSession.sendMessage()发送保持活动消息,但它不起作用。

我想在隐藏的演员 - 媒体播放器中播放一些内容,以欺骗它以为我在玩某些东西,但我认为这是一个非常肮脏的解决方案。

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

2 个答案:

答案 0 :(得分:0)

看看

cast.framework.CastReceiverOptions.maxInactivity

答案 1 :(得分:0)

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

AFAIK,没有办法以干净的方式避免这种行为,所以我选择了肮脏的解决方案。我把一个隐藏的演员级媒体播放器放在接收器中,然后我发送一个不存在的图像。它试图加载图像(进入状态BUFFERING),但它失败了。通过这种方式它重置了IDLE计时器,应用程序不再退出。

我希望将来对其他人有所帮助。

编辑:添加了更长的解释

为了解决这个问题,我不得不添加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请求和播放器状态的侦听器仅在处于IDLE状态时请求图像,但是我现在没有足够的时间尝试它。 如果我愿意,我会更新我的答案。

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