2015-04-06 4 views
2

Из-за взломанных изменений в примере клиента Android WebRTC я ищу пример кода, который показывает, как добавлять и работать с DataChannel в Android. Мне нужно просто отправить «Hello Worlds» через DataChannel между двумя устройствами Android. Вот старый код:Работа с DataChannel в приложении Android WebRTC

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

Он использует некоторые классы и интерфейсы, которые не существуют в новой версии больше.

Так как я могу добавить поддержку DataChannel к моему Android Приложение WebRTC, отправляйте и получайте текст через него?

ответ

6

Я добавил 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)); 


} 

Я только взял быстрый взгляд на новых классах и внес небольшие изменения в свой код, я надеюсь, что он будет работать для вас без каких-либо изменений больше.

Успехов

+0

** после isInitiator = false;: ** 'if (isInitiator) {...' - это никогда не будет выполнено. Что ты имел в виду? –

+0

Мой плохой, как я уже сказал, я внес некоторые коррективы в код, который я использовал, чтобы соответствовать текущему классу кода. Я передаю значение isInitiator в конструкторе peerConnectionClient, чтобы узнать, кто инициировал вызов и создал канал данных для инициатора. (другой одноранговый узел получает канал данных в onDataChannel). плохой выбор именования, поскольку класс уже использует isInitiator, поэтому вы можете изменить имя переменной для оператора if (if (isInitiator) {...) –

+0

, так что мне нужно удалить 'isInitiator = false'? –

1

Мне очень жаль, что у меня есть вопрос к коду от Guy S.

В вашем коде есть две следующие утверждения в обоих createPeerConnectionInternal() и onDataChannel().

dataChannel.registerObserver(new DcObserver()); 

Я думаю, что это может привести к двум регистрациям. Правильно ли это?

Я имею в виду, что перед выполнением вызова он создал DataChannal и зарегистрировал Наблюдателя. Тогда .. если есть входящий вызов, вызываемый onDataChannel, то dataChannel указывает на dc и регистрируется снова ??

+0

И я попробовал ваш код при вызове dataChannel = pc .createDataChannel ("1", dcInit); Ошибки: 04-09 18: 01: 59.458: E/libjingle (32109): Ошибка (datachannel.cc:127): Не удалось инициализировать канал данных RTP из-за недействительного DataChannelInit. 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, строка 1253 04-09 18: 01: 59.458: E/rtc (32109): # Ошибка проверки: nativeChannelPtr 04-09 18: 01: 59.458: E/rtc (32109): # Не удалось создать DataChannel –

+0

, вы можете задать вопрос. –

+0

Привет, Александр, у вас есть рабочий пример кода? –

Смежные вопросы