从未调用过投射自定义频道回调

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) 方法永远不会被调用。

我假设一旦接收者注册了会话,就不需要再次注册。但是由于某种原因,回调仍然没有起作用。

作为最后的手段,为了确保我在ActivityOnCreate() 中重新注册了接收器。

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

织梦后台频道页调用新建模型中的自定义字段所感

自定义 LayerDrawable:onStateChange 从未调用

Core Data 自定义访问器甚至没有被调用

但回调方法出错 请检查自定义load回调函数是啥

Invalidate 未调用自定义视图类的 onDraw