从未调用过投射自定义频道回调
Posted
技术标签:
【中文标题】从未调用过投射自定义频道回调【英文标题】:Cast custom channel callback never called 【发布时间】:2017-04-10 15:43:35 【问题描述】:我正在开发一个与 Cast 接收器应用通信的 android 应用。
连接到应用程序正常(我可以看到应用程序出现在电视上),但我无法让自定义频道正常工作。
在我的 Activity 的 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 应用,而该同事确实收到了回调。
【问题讨论】:
【参考方案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
【讨论】:
【参考方案2】:我遇到了同样的问题,这就是我设法发送消息的方式:
context.sendCustomMessage(namespace, undefined, JSON.stringify(
"a": "b"
));
这是接收方的 javascript。因此,您需要“未定义”参数并使用 JSON.stringify(),否则消息会被静默丢弃。 未定义的意思是“发送给所有人”,但您可能应该在此处指定发件人 ID。
这是在 v3 API 中。
【讨论】:
【参考方案3】:就我而言,它更微妙。
第一次启动演员会议时,回调工作得非常好。当用户按下投射按钮时,接收者注册消息回调。
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)
方法永远不会被调用。
我假设一旦接收者注册了会话,就不需要再次注册。但是由于某种原因,回调仍然没有起作用。
作为最后的手段,为了确保我在Activity
的OnCreate()
中重新注册了接收器。
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 App) 和 Cast Receiver 之间的通信只发生在字符串消息为 JSON
格式时。
【讨论】:
以上是关于从未调用过投射自定义频道回调的主要内容,如果未能解决你的问题,请参考以下文章
动易CMS如何在文章频道,文章自定义列表标签中调用“自定义自段$MY_ABC