【问题标题】:Working with DataChannel in Android WebRTC application在 Android WebRTC 应用程序中使用 DataChannel
【发布时间】:2016-10-03 18:00:36
【问题描述】:

由于 Android WebRTC 客户端示例中的重大更改,我正在寻找代码示例,该示例展示了如何在 Android 中添加和使用 DataChannel。我只需要通过 DataChannel 在 2 个 Android 设备之间发送“Hello Worlds”。这是旧代码:

https://chromium.googlesource.com/external/webrtc/stable/talk/+/master/examples/android/src/org/appspot/apprtc/AppRTCDemoActivity.java#177

它使用了一些新版本中不再存在的类和接口。

那么我怎样才能在我的 Android WebRTC 应用程序中添加对 DataChannel 的支持,通过它发送和接收文本?

【问题讨论】:

    标签: java android webrtc


    【解决方案1】:

    我在一个使用旧版本 webrtc 的项目中添加了 DataChannel。我查看了最新的类,似乎方法和回调仍然存在,所以希望它对你有用。

    更改为PeerConnectionClient

    createPeerConnectionInternalisInitiator = false; 之后创建DataChannel:

    DataChannel.Init dcInit = new DataChannel.Init();
    dcInit.id = 1;
    dataChannel = pc.createDataChannel("1", dcInit);;
    dataChannel.registerObserver(new DcObserver());
    

    更改为onDataChannel

    @Override 
    public void onDataChannel(final DataChannel dc) {
        Log.d(TAG, "onDataChannel");
        executor.execute(new Runnable() {
            @Override
            public void run() {
                dataChannel = dc;
                String channelName = dataChannel.label();
                dataChannel.registerObserver(new DcObserver());
            }
        });
    }
    

    添加频道观察者:

    private class DcObserver implements DataChannel.Observer {
    
        @Override 
        public void onMessage(final DataChannel.Buffer buffer) {
    
            ByteBuffer data = buffer.data; 
            byte[] bytes = new byte[data.remaining()];
            data.get(bytes);
            final String command = new String(bytes);
    
            executor.execute(new Runnable() {
                public void run() {
                    events.onReceivedData(command);
                }
            });
    
        }
    
        @Override
        public void onStateChange() {
            Log.d(TAG, "DataChannel: onStateChange: " + dataChannel.state());
        }
    }
    

    我将onReceivedDataevents 添加到PeerConnectionEvents 接口,所有事件都在CallActivity 中实现,所以我从那里处理通道上接收到的数据。

    从 CallActivity 发送数据:

    public void sendData(final String data) {
    
        ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
        peerConnectionClient.getPCDataChannel().send(new DataChannel.Buffer(buffer, false));
    
    
    }
    

    我只是快速浏览了一下新的类并对我的代码做了一些小的改动,我希望它在没有更多改动的情况下对你有用。

    祝你好运

    【讨论】:

    • 在 isInitiator = false;: if (isInitiator) {... - 永远不会被执行。你什么意思?
    • 我的错,就像我说的,我对用于匹配当前类代码的代码进行了一些调整。我在 peerConnectionClient 构造函数中传递 isInitiator 值,以查看谁发起了调用并为发起者创建数据通道。 (其他对等方在 onDataChannel 中获取数据通道)。由于该类已经使用了 isInitiator,因此命名选择不佳,因此您可能需要更改 if 语句的变量名称 (if (isInitiator) {...)
    • 所以我需要删除isInitiator = false吗?
    • 保持 isInitiator = false ,去掉 if 语句。 (我已经编辑了答案)
    • 谢谢,我马上试试。
    【解决方案2】:

    很抱歉,我对 Guy S 的代码有疑问。

    在您的代码中,createPeerConnectionInternal() 和 onDataChannel() 中都有以下两条语句。

    dataChannel.registerObserver(new DcObserver());
    

    我认为这可能会导致两次注册。对吗??

    我的意思是,在拨打电话之前,它创建了一个数据通道并注册了一个观察者。然后..如果有调用进来,onDataChannel被调用,那么dataChannel指向dc并重新注册??

    【讨论】:

    • 我尝试了你的代码,调用 dataChannel = pc.createDataChannel("1", dcInit);它显示以下错误 04-09 18:01:59.458: E/libjingle(32109): Error(datachannel.cc:127): 由于 DataChannelInit 无效,无法初始化 RTP 数据通道。 04-09 18:01:59.458: E/rtc(32109): # 04-09 18:01:59.458: E/rtc(32109): # ../../talk/app/webrtc/java 中的致命错误/jni/peerconnection_jni.cc, line 1253 04-09 18:01:59.458: E/rtc(32109): # 检查失败:nativeChannelPtr 04-09 18:01:59.458: E/rtc(32109): # 未能创建数据通道
    • 你可以打开一个问题。
    • 不,抱歉,只有一个有错误的。
    • 我刚刚删除了“dcInit.id=1;”这一行并再次运行它,它现在不会崩溃。但现在设置 remoteDescription 失败。我将提出一个新问题。
    • 我在这里提出了一个新问题:stackoverflow.com/questions/29556425/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多