java - 在 Android WebRTC 应用程序中使用 DataChannel

标签 java android webrtc

由于 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

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

那么我如何才能为我的 Android WebRTC 应用程序添加对 DataChannel 的支持,并通过它发送和接收文本?

最佳答案

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

PeerConnectionClient 的更改:

isInitiator = false; 之后,在 createPeerConnectionInternal 中创建 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());
        }
    });
}

添加 channel 观察者:

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

我将 onReceivedData 事件添加到 PeerConnectionEvents 接口(interface),所有事件都在 CallActivity 中实现,因此我从那里处理 channel 上接收到的数据。

从 CallActivity 发送数据:

public void sendData(final String data) {

    ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
    peerConnectionClient.getPCDataChannel().send(new DataChannel.Buffer(buffer, false));


}

我只是快速浏览了新类并对我的代码做了一些小改动,我希望它能为你工作而不需要做更多的改动。

祝你好运

关于java - 在 Android WebRTC 应用程序中使用 DataChannel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29465192/

相关文章:

java - Spring REST - 在更长的空闲时间之后,第一次调用需要很长时间(5-10 秒)

Java 9 整数到字符串转换

java - 调试变量时遇到问题可能未初始化错误

android - segment.io 服务器是否真的将事件路由到多个目的地或移动 sdk?

webrtc - Agora WebSDK-NG 音频可视化工具

java - 游戏中的 SharedPreferences

android - 捕获权限授予完成事件

Android如何在linearlayout中逐行编程添加Textview

javascript - 使用 PeerJS 进行广播或对等发现

react-native - 如何在 react-native-webrtc 中使用 simple-peer