2017-10-05 73 views
0

我写了需要执行两个任务的店播送应用程序:在后台与光滑保持谷歌Cast接收活着和/或发送连接

  • 显示一些广告(静态图像)(可能图像转换);
  • 在角落显示“我们正在服务”号码。

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

一切都像一个魅力,但几分钟后发件人断开连接并退出接收器,离开屏幕与谷歌Chromecast背景图片。

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

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

我曾想过在隐藏的演员播放器中播放某些内容以欺骗它以认为我在播放某些内容,但我认为这是一个相当脏的解决方案。

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

回答

0

我就这一问题进行进一步调查,我发现,问题是,玩家在接收器处于空闲状态,太很长,因此关闭应用程序和与发件人的任何连接。

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

我希望这会对未来的其他人有所帮助。

编辑:添加较长的解释

为了使解决办法,我不得不通过在接收端应用程序的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上发布它。项目准备就绪后,我会尽快更新答案。

+0

我也在自定义接收器中渲染自定义内容(隐藏/忽略接收器播放器)并希望保持连接活着。你能分享一下你的解决方案Andrea的更多细节吗? 您是否尝试加载一次不存在的图像,并且足以让所有内容都无限期地存活?您是否必须定期尝试加载不存在的图像?如果定期发送,您是否发送了发送方的请求或处理接收方中的所有内容?你可以与我们分享你的代码吗? –

+0

不幸的是,我没有设法复制你的结果Andrea。我使用的是iOS Cast SDK,但翻译您发布的电话非常容易。我需要3个星期才能完成任务,这是释放辛苦工作的最后一个障碍。有什么可以分享的东西可以帮助我吗?接收器代码?接收器控制台输出,所以我知道我应该看起来像什么?我感谢您提供的任何和所有帮助 –

+0

提出了一个问题,如果您还想在那里安慰Andrea :) https://stackoverflow.com/questions/46673152/google-cast-custom-receiver-timing-out –

0

看一看

cast.framework.CastReceiverOptions.maxInactivity

+0

试过了,但没有奏效。无论如何,谢谢 –