我正在使用与Cast接收器应用进行通信的Android应用。
连接到应用程序(我可以看到应用程序出现在电视上),但我很难让自定义频道正常工作。
在我的活动的onCreate中,我获得了CastContext并添加了我的SessionManagerLister。
mCastContext = CastContext.getSharedInstance(this);
mCastContext.getSessionManager().addSessionManagerListener(getSessionManagerListener(), CastSession.class);
getSessionManagerListener()
返回我注册MessageReceivedCallback
的监听器:
private SessionManagerListener<CastSession> getSessionManagerListener()
{
return new SessionManagerListener<CastSession>()
{
@Override
public void onSessionStarted(CastSession castSession, String s)
{
try
{
castSession.setMessageReceivedCallbacks("urn:x-cast:be.myappname.player.cast.v1", new Cast.MessageReceivedCallback()
{
@Override
public void onMessageReceived(CastDevice castDevice, String s, String s1)
{
System.out.println("never reaches this callback");
}
});
}
catch (IOException e)
{
e.printStackTrace();
}
}
... other methods omitted ...
}
}
当我点击工具栏投射按钮时,我可以选择一个设备,它会触发SessionManagerListener中的onSessionStarted
(这也会启动电视上的接收器应用程序)。然后我添加MessageReceivedCallback
,但它的回调永远不会被调用。
在Chrome中检查我的Cast设备确实会显示我希望收到的数据,但它似乎永远不会达到我的Android代码。
cast_receiver.js:67 [667.202s] [cast.receiver.IpcChannel] IPC message
[667.202s] [cast.receiver.IpcChannel] IPC message sent: {"namespace":"urn:x-cast:be.myappname.player.cast.v1","senderId":"7c442884-74e6-a388-243c-58b4ab3a4527.3471:com.google.sample.cast.refplayer.tutorial-512","data":"{\"type\":\"login request\"}"}
一位同事正在研究iOS应用程序,而且确实收到了回调。
答案 0 :(得分:1)
在onSessionStarted
中尝试以下操作CastContext cc = CastContext.getSharedInstance(this);
SessionManager sm = cc.getSessionManager();
if (sm != null) {
CastSession cs = sm.getCurrentCastSession();
if (cs != null) {
try {
MyCastChannel mcc = new MyCastChannel();
cs.setMessageReceivedCallbacks("urn:x-cast:be.myappname.player.cast.v1",mcc);
}
catch (IOException e) {
}
}
}
public class MyCastChannel implements Cast.MessageReceivedCallback
{
@Override
public void onMessageReceived(CastDevice castDevice, String namespace, String message)
{
// do your thing
}
}
答案 1 :(得分:0)
我遇到了同样的问题,这就是我设法获得要发送的消息的方法:
context.sendCustomMessage(namespace, undefined, JSON.stringify({
"a": "b"
}));
这是接收方的JavaScript。因此,您需要“未定义”参数,还需要使用JSON.stringify(),否则消息将被静默删除。 未定义的意思是“发送给所有人”,但是您可能应该在此处指定sender-id。
这是在v3 API中。
答案 2 :(得分:0)
就我而言,它更微妙。
当第一次启动投射会话时,回调工作得非常好。当用户按下投射按钮时,接收者就注册了消息回调。
override fun onSessionStarted(castSession: CastSession?, p1: String?) {
liveViewModel.requestPause()
castSession?.let {
setCastChannelReceiver(it, this@myActivity)
loadRemoteMedia(it, buildChromeCastInfo())
}
}
fun setCastChannelReceiver(castSession: CastSession?, receiver: CastMessageReceiver) {
castSession?.let {
castChannel.addReceiver(receiver, castSession)
it.setMessageReceivedCallbacks(castChannel.nameSpace, castChannel)
}
}
尽管当用户使用终止启动投射会话的 Activity
然后在遍历应用程序的其他部分后再次访问 Activity
时,回调无法工作。
请记住,当用户第二次访问 Activity
时,CastSession
已经连接。因此,永远不会调用 onSessionStarted(castSession: CastSession, p1: String)
方法。
我假设一旦接收方为会话注册,就不需要再次注册。但由于某种原因,回调从未奏效。
作为最后的手段,为了确保我在 OnCreate()
的 Activity
中重新注册了接收器。
override fun onCreate(out:Bundle){
....
setCastChannelReceiver(castSession, receiver)
....
}
fun setCastChannelReceiver(castSession: CastSession?, receiver: CastMessageReceiver) {
castSession?.let {
castChannel.addReceiver(receiver, castSession)
it.setMessageReceivedCallbacks(castChannel.nameSpace, castChannel)
}
}
它奏效了!!
注意:对我来说,Sender(Android 应用程序)和 Cast Receiver 之间的通信仅在字符串消息为 JSON
格式时发生。