1

Androidにデータチャネルを実装しようとしました。データチャネルを使用して、Android から Web にデータを正常に送信しました。

ただし、Web から Android にデータを送信しようとすると、Android はデータを受信せず、onMessage() はトリガーされません。

なぜこれが起こるのかわかりません。DataChannel.Observer を実装する方法は次のとおりです。

private class DcObserver implements DataChannel.Observer {
 // removed other overrided messages for clarity
 @Override
 public void onMessage(DataChannel.Buffer buffer) {
   Toast.makeText(getApplicationContext(),
                   "Some Data has been received", Toast.LENGTH_SHORT)
                   .show();
   Log.d("Data", "Some Data has been received");
 }
}

PeerConnection オブジェクトごとにオブジェクトを作成します。PeerConnection オブジェクトを含むこのクラスがあります。

private class FilePeer implements SdpObserver {
 private PeerConnection pc;
 private DataChannel dc;
 // removed other overrided methods for clarity
 public FilePeer() {
   PcObserver pcObserver = new PcObserver();

   pc = factory.createPeerConnection(RTCConfig.getIceServer(), 
       RTCConfig.getMediaConstraints(), pcObserver);

   dc = pc.createDataChannel("sendDataChannel", new DataChannel.Init());

    //DcObserver dcObserver = new DcObserver();

    //dc.registerObserver(dcObserver);    // This one crashes the app, therefore, getting the datachannel using onDataChannel
 }
}

これは、PcObserver クラスがどのように見えるかです。

private class PcObserver implements PeerConnection.Observer{

 @Override
 public void onDataChannel(final DataChannel dataChannel) {

  runOnUiThread(new Runnable() {
     public void run() {
         peer.dc = dataChannel;

         DcObserver dcObserver = new DcObserver();

         peer.dc.registerObserver(dcObserver);

         //dataChannel.registerObserver(dcObserver);
     }
   });
 }
 // other methods are removed for clarity
}

私は何か間違ったことをしていると思いますが、peer.dc.registerObserver(dcObserver);何がわかりません。

4

1 に答える 1

1

webrtc グループでこの問題の解決策を見つけました。

DataChannel がコールバックしたときにオブザーバーが破棄されないように、オブザーバーの参照を保持する必要があります。

peer.dc = dataChannel;もう1つ、内部onDataChannel();を削除する必要があります。

次のコードは今私にとってはうまくいきます:

    public void onDataChannel(final DataChannel dataChannel) {
        final DataChannel dc = dataChannel;
        runOnUiThread(new Runnable() {
              public void run() {

                    DcObserver dcObserver = new DcObserver();

                    peer.dc.registerObserver(dcObserver);

              }
            });


    }
于 2015-04-18T12:28:36.587 に答える