ApprtcDemo con il server locale funziona tra browser ma non Android nativo nel browser

Sto sviluppando un'applicazione di chat e ho fatto con esso. Ora voglio anche implementare la chat video. Dopo la ricerca ho deciso di andare con la biblioteca "WebRTC".

Cosa ho fatto?

  • Nessun metodo di questo tipo di metodo per scolbind la chiamata
  • onListItemClick non funziona per listview?
  • Android rileva quando le linee sono state collegate durante una chiamata in output
  • Android: Inserimento in massa, quando InsertHelper è deprecata
  • Programmaticamente chiara la cache di PhoneGap / Cordova app su Android per simulare una nuova installazione?
  • Esegui il codice sul thread principale in Android senza accesso ad un'attività?
  • 1) è in grado di eseguire AppRtcDemo presso il server locale e il suo funzionamento fine tra i browser.

    Riferimento: http://www.webrtc.org/reference/getting-started

    2) in grado di build Android AppRtcDemo.But quando eseguo dire "l'origine croce non support".

    Dopo la ricerca ho trovato in discussione webrtc che per risolvere questo problema ho bisogno di impostare il proprio server di turno.

    3) Quindi installo l'ultima rfc5766TurnServer raccomandata da webrtc. Ho successo per eseguire il server di turno.

    Riferimento: http://code.google.com/p/rfc5766-turn-server/

    Faccio le seguenti modifiche a ApprtcDemo (web) e (Android) per lavorare con il mio server Turn

    1) apprtc.py

    Sostituire:

    turn_url = 'https://computeengineondemand.appspot.com/' turn_url = turn_url + 'turn?' + 'username=' + user + '&key=4080218913' 

    Con riferimento al mio assistente di turno:

     turn_url = 'http://192.168.5.85:3478/?service=turn&username=biraj' 

    2) index.html

    Sostituire:

     var pcConfig = {{ pc_config|safe }}; 

    Con:

     var pcConfig = {"iceServers": [{"url": "stun:stun.l.google.com:19302"}, {"url":"turn:biraj@192.168.5.85:3479", "credential":"0x5b04123c3eec4cf0be64ab909bb2ff5b"}]}; 

    android

    1) AppRTCDemoActivity.java

    Sostituire:

     roomInput.setText("https://apprtc.appspot.com/?r="); 

    Con il mio server apprtc locale:

     roomInput.setText("http://192.168.5.86:8080/?r="); 

    2) AppRTCClient.java

    Nella function private PeerConnection.IceServer requestTurnServer(String url){}

    Sostituire:

     connection.addRequestProperty("origin", "https://apprtc.appspot.com"); 

    Con:

     connection.addRequestProperty("origin", "http://192.168.5.86:8080"); 

    3) /assets/channel.html

    Sostituire:

     <script src="https://apprtc.appspot.com/_ah/channel/jsapi"></script> 

    Con:

     <script src="http://192.168.5.86:8080/_ah/channel/jsapi"></script> 

    Ora la mia domanda è perché questo funziona tra i browser ma non tra Android AppRtcDemo e browser.

    Quando eseguo AppRtcDemo su android dopo aver fatto sopra le modifiche, l'anteprima della telecamera locale viene avviata nell'angolo in alto a destra e il messaggio "In attesa di ICEcandidates", allora non succede nulla.

    Grazie in anticipo.

    Grazie a tutti per sostenere la mia domanda. Dopo una lunga passeggiata rocciosa con ApprtcDemo ho successo e funziona bene. Sto postando la soluzione.

    Trova il file java " GAEChannelClient.java ".

    e cambiano come sotto.

     /* * libjingle * Copyright 2013, Google Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.appspot.apprtc; import java.io.InputStream; import android.annotation.SuppressLint; import android.app.Activity; import android.util.Log; import android.webkit.ConsoleMessage; import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; /** * Java-land version of Google AppEngine's JavaScript Channel API: * https://developers.google.com/appengine/docs/python/channel/javascript * * Requires a hosted HTML page that opens the desired channel and dispatches JS * on{Open,Message,Close,Error}() events to a global object named * "androidMessageHandler". */ public class GAEChannelClient { private static final String TAG = "GAEChannelClient"; private WebView webView; private final ProxyingMessageHandler proxyingMessageHandler; /** * Callback interface for messages delivered on the Google AppEngine * channel. * * Methods are guaranteed to be invoked on the UI thread of |activity| * passed to GAEChannelClient's constructor. */ public interface MessageHandler { public void onOpen(); public void onMessage(String data); public void onClose(); public void onError(int code, String description); } /** Asynchronously open an AppEngine channel. */ @SuppressLint("SetJavaScriptEnabled") public GAEChannelClient(Activity activity, String token, MessageHandler handler) { webView = new WebView(activity); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setAllowFileAccessFromFileURLs(true); // Maybe you // don't // need this // rule webView.getSettings().setAllowUniversalAccessFromFileURLs(true); webView.setWebChromeClient(new WebChromeClient() { // Purely for // debugging. public boolean onConsoleMessage(ConsoleMessage msg) { Log.d(TAG, "console: " + msg.message() + " at " + msg.sourceId() + ":" + msg.lineNumber()); return false; } }); webView.setWebViewClient(new WebViewClient() { // Purely for debugging. public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.e(TAG, "JS error: " + errorCode + " in " + failingUrl + ", desc: " + description); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { System.out.println("HI"); return super.shouldOverrideUrlLoading(view, url); } }); proxyingMessageHandler = new ProxyingMessageHandler(activity, handler, token); webView.addJavascriptInterface(proxyingMessageHandler, "androidMessageHandler"); // webView.loadUrl("file:///android_asset/channel.html"); try { InputStream is = activity.getAssets().open("channel.html"); StringBuilder builder = new StringBuilder(); byte[] buffer = new byte[1024]; while (is.read(buffer) != -1) { builder.append(new String(buffer)); } is.close(); String str = builder.toString(); webView.loadDataWithBaseURL("http://192.168.5.86:8080", str, "text/html", "utf-8", null); } catch (Exception e) { e.printStackTrace(); } } /** Close the connection to the AppEngine channel. */ public void close() { if (webView == null) { return; } proxyingMessageHandler.disconnect(); webView.removeJavascriptInterface("androidMessageHandler"); webView.loadUrl("about:blank"); webView = null; } // Helper class for proxying callbacks from the Java<->JS interaction // (private, background) thread to the Activity's UI thread. private static class ProxyingMessageHandler { private final Activity activity; private final MessageHandler handler; private final boolean[] disconnected = { false }; private final String token; public ProxyingMessageHandler(Activity activity, MessageHandler handler, String token) { this.activity = activity; this.handler = handler; this.token = token; } public void disconnect() { disconnected[0] = true; } private boolean disconnected() { return disconnected[0]; } @JavascriptInterface public String getToken() { return token; } @JavascriptInterface public void onOpen() { System.out.println("GAEClient : Open" ); activity.runOnUiThread(new Runnable() { public void run() { if (!disconnected()) { handler.onOpen(); } } }); } @JavascriptInterface public void onMessage(final String data) { System.out.println("GAEClient : Message : " +data ); activity.runOnUiThread(new Runnable() { public void run() { if (!disconnected()) { handler.onMessage(data); } } }); } @JavascriptInterface public void onClose() { System.out.println("GAEClient : Close" ); activity.runOnUiThread(new Runnable() { public void run() { if (!disconnected()) { handler.onClose(); } } }); } @JavascriptInterface public void onError(final int code, final String description) { System.out.println("GAEClient : Erroe : " + description); activity.runOnUiThread(new Runnable() { public void run() { if (!disconnected()) { handler.onError(code, description); } } }); } } } 

    Canale.html nella cartella degli asset

     <html> <head> <script src="http://192.168.5.86:8080/_ah/channel/jsapi"></script> </head> <!-- Helper HTML that redirects Google AppEngine's Channel API to a JS object named |androidMessageHandler|, which is expected to be injected into the WebView rendering this page by an Android app's class such as AppRTCClient. --> <body onbeforeunload="closeSocket()" onload="openSocket()"> <script type="text/javascript"> var token = androidMessageHandler.getToken(); if (!token) throw "Missing/malformsd token parameter: [" + token + "]"; var channel = null; var socket = null; function openSocket() { channel = new goog.appengine.Channel(token); socket = channel.open({ 'onopen': function() { androidMessageHandler.onOpen(); }, 'onmessage': function(msg) { androidMessageHandler.onMessage(msg.data); }, 'onclose': function() { androidMessageHandler.onClose(); }, 'onerror': function(err) { androidMessageHandler.onError(err.code, err.description); } }); } function closeSocket() { socket.close(); } </script> </body> </html> 

  • Android - Come posso scoprire quanti email non letti l'utente ha?
  • google mappe api per android, ottenendo SHA1 cert invece di MD5
  • come analizzare il file IC utilizzando ICal4j in android
  • L'animation Android non si ripete
  • Android JavascriptInterface Security?
  • Videocamera di logging di Android, ma gioca a testa in giù
  • One Solution collect form web for “ApprtcDemo con il server locale funziona tra browser ma non Android nativo nel browser”

    Purtroppo non so se hai fatto queste cose:

    1. Utilizzare lo stunt SAME e ruotare il server su each applicazione (PC o mobile).
    2. Stai anche inviando i candidati ICE tra le applicazioni (credo di farlo, ma solo per verificare).
    3. Sei sicuro che l'URL di STUN / TURN è quello che dà l'errore, in quanto non riesco a credere che queste cose riguardano le origini cross (non dovrebbero, in quanto si sta solo collegando da un client a un server. l'origine è per lo più "usata" nelle pagine web che caricano dati da una fonte esterna. Non è consentito farlo da un XHR). Penso davvero che abbia qualcosa a che fare con https://apprtc.appspot.com/_ah/channel/jsapi , poiché questo è un buon esempio di roba di origine croce.

    Che cosa succede se apri la pagina web che sta lavorando nel tuo browser Chrome sul tuo cellulare? Che cosa fa allora? (si noti che è ansible colbind il telefono al PC per avere gli strumenti di sviluppo completi di Chrome. Chrome funziona sul tuo dispositivo android, ma puoi vedere i devtools sul tuo pc).

    Se riesci a fornirmi queste risposte, potrei essere in grado di aiutarti. Tenti di ripristinare tutte queste modifiche e utilizzare solo il server TURN di Google, ma fai solo che https://apprtc.appspot.com/_ah/channel/jsapi file local.

    EDIT: vedo che hai trovato la tua risposta . Ti piacerebbe condividerlo?

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.