我正在为一家需要执行两项任务的商店编写一个Cast应用程序:
我已经开发了应用程序(包括自定义接收方和Android发送方)。广告由服务器提供,因此嵌入到接收方应用程序中,而发送方应用程序用于控制“我们正在服务”号。
一切都很有魅力,但过了几分钟,发件人断开了连接,接收者退出了,屏幕上留下了谷歌Chromecast背景图片。
虽然我可以接受发送者断开连接(即使我想避免它),接收者应用程序退出是不可接受的。
我试着通过CastSession.sendMessage()发送保持活动的消息,但是没有成功。
我想在一个隐藏的媒体播放器中播放一些内容来欺骗它,让它以为我在玩什么,但我认为这是一个非常肮脏的解决方案。
是否有可能以更好的方式实现我正在努力做的事情?
发布于 2017-10-07 00:56:52
我对这个问题做了进一步的调查,发现问题在于接收者中的玩家处于空闲状态太长时间,因此关闭应用程序和与发送者的任何连接。
AFAIK,没有办法以干净的方式避免这种行为,所以我选择了肮脏的解决方案。我在接收器里放了一个隐藏的媒体播放器,然后我发送给它一个不存在的图像。它试图加载映像(进入状态缓冲),但失败了。以这种方式,它重置空闲计时器,应用程序不再退出。
我希望这会对将来的其他人有所帮助。
编辑:添加了更长的解释
为了解决这个问题,我必须添加cast媒体播放器标记并通过接收程序中的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请求,而播放器状态上的侦听器只在映像处于空闲状态时才请求它,但我现在没有足够的时间尝试它。如果我愿意,我会更新我的答案。
目前我无法共享完整的应用程序代码,但我打算在将来在GitHub上发布它。项目一做好,我就会更新我的答案。
发布于 2021-09-17 05:23:57
一个更简单的解决方案是设置disableIdleTimeout:在传递给CastReceiverContext.start()的CastReceiverOptions中为true。这会让你的接收器保持运转。
示例(带有CastReceiverOptions内联结构的代码):
context = cast.framework.CastReceiverContext.getInstance();context.start({disableIdleTimeout: true});
发布于 2017-10-06 09:02:01
看一下
cast.framework.CastReceiverOptions.maxInactivity
https://stackoverflow.com/questions/46583554
复制相似问题