我正在为需要执行两项任务的商店编写Cast应用程序:
我已经开发了应用程序(自定义接收器和Android发送器)。广告由服务器提供,因此嵌入在接收器应用程序中,而发件人应用程序用于控制“我们正在服务”号码。
一切都像魅力一样,但几分钟后发送者断开连接并退出接收器,屏幕上显示谷歌Chromecast背景图像。
虽然我可以接受发送方断开连接(即使我想避免它),但接收方应用程序退出是不可接受的。
我尝试通过CastSession.sendMessage()发送保持活动消息,但它不起作用。
我想在隐藏的演员 - 媒体播放器中播放一些内容,以欺骗它以为我在玩某些东西,但我认为这是一个非常肮脏的解决方案。
是否有可能以更好的方式实现我想要做的事情?
答案 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上发布它。一旦项目准备就绪,我会立即更新我的答案。