从未调用过自定义通道回调

时间:2017-04-10 15:43:35

标签: android chromecast

我正在使用与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应用程序,而且确实收到了回调。

3 个答案:

答案 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 格式时发生。