在Android WebRTC应用程序中使用DataChannel



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

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

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

那么,我如何将对DataChannel的支持添加到我的AndroidWebRTC应用程序中,并通过它发送和接收文本呢?

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

PeerConnectionClient:的更改

isInitiator = false;:之后在createPeerConnectionInternal中创建数据通道

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());
    }
}

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

要发送数据,请从CallActivity:

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

}

我只是快速浏览了一下新的类,并对我的代码进行了一些小的更改,我希望它能在没有更多更改的情况下为您工作。

祝好运

很抱歉,我对Guy S.的代码有问题

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

dataChannel.registerObserver(new DcObserver());

我认为这可能会导致两次注册。这是正确的吗??

我的意思是,在打电话之前,它创建了一个dataChannal并注册了一个Observer。然后如果有一个调用传入,onDataChannel被调用,那么dataChannel指向dc并再次注册??

相关内容

最新更新