Я добавил DataChannel в проект со старой версией webrtc. Я посмотрел на самые современные классы, и кажется, что методы и обратные вызовы все еще существуют, поэтому, надеюсь, это сработает для вас.
Изменения PeerConnectionClient
:
Создать DataChannel в createPeerConnectionInternal
после isInitiator = false;
:
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());
}
}
Я добавил onReceivedData
событий в интерфейс 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) {...' - это никогда не будет выполнено. Что ты имел в виду? –
Мой плохой, как я уже сказал, я внес некоторые коррективы в код, который я использовал, чтобы соответствовать текущему классу кода. Я передаю значение isInitiator в конструкторе peerConnectionClient, чтобы узнать, кто инициировал вызов и создал канал данных для инициатора. (другой одноранговый узел получает канал данных в onDataChannel). плохой выбор именования, поскольку класс уже использует isInitiator, поэтому вы можете изменить имя переменной для оператора if (if (isInitiator) {...) –
, так что мне нужно удалить 'isInitiator = false'? –