2011-08-09 22 views
20

Estoy intentando que JWPlayer devuelva una alerta cuando ocurren algunos eventos específicos de un reproductor flash que reproduce un video local. Si observa en el siguiente código, onComplete, JWPlayer debería devolver una alerta, que luego puede ser interceptada por jSAlert desde setWebChromeClient para que pueda hacer cosas con esa información. ¿Estoy haciendo algo mal?JWPlayer API de Javascript para Android Webview

Una posible razón, puedo encontrar aquí: JWplayer Javascript interaction not working que se está cargando localmente. ¿Hay alguna manera de evitar este problema? ¿Sería más fácil cargar de alguna manera llamando al localhost? ¿Es eso posible?

Para aquellos de ustedes que tienen curiosidad acerca de por qué genero un archivo HTML en lugar de solo tener un movimiento de los activos: después de buscar en Internet para encontrar un flv player local que funcione correctamente, la mejor opción era generar el Archivo HTML con la información personalizada y escriba el archivo en el mismo directorio que FLV (de ahí la función FileWriter).

código HTML para JWPlayer incrustar:

private void createVideoHtml(File flvDirectory, File htmlFile, String videofilename) 
{ 
    String htmlPre = "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"></head><body style='margin:0; padding:0;'>"; 
    String htmlCode = 
      "<script type='text/javascript' src='"+ flvDirectory.getAbsolutePath() + "/jwplayer.js'></script>" + 
      "<div id='mediaspace'>EZ Stream TV FLV Player</div>" + 
      "<script type='text/javascript'>" + 
      "jwplayer('mediaspace').setup({" + 
      "'flashplayer': '"+ flvDirectory.getAbsolutePath() + "/player.swf', 'file': '" + videofilename + "', 'backcolor': 'FFFFFF', 'frontcolor': '000000', 'lightcolor': '000000'," + 
      "'screencolor': '000000', 'volume': '100', 'autostart': 'true', 'mute': 'false', 'quality': 'false', 'controlbar': 'bottom', 'width': '100%', 'height': '100%'," + 
      "events: { " + 
      "onComplete: function() { alert('COMPLETED');}" + 
      "}});" + 
      "</script>"; 
    String htmlPost = "</body></html>"; 
    String finalHTML = htmlPre + htmlCode + htmlPost; 

    try { 
     FileWriter f = new FileWriter(htmlFile); 
     PrintWriter p = new PrintWriter(f); 
     p.print(finalHTML); 
     p.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Código de vistas web y gastos de la alerta javscript:

webView = (WebView)findViewById(R.id.web_player); 
    webView.getSettings().setBuiltInZoomControls(false); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setLoadsImagesAutomatically(true); 
    webView.getSettings().setPluginsEnabled(true); 
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
    webView.getSettings().setAllowFileAccess(true); 
    webView.setInitialScale(60); 
    webView.setBackgroundColor(Color.BLACK); 
    getWindow().addFlags(128); 
    webView.getSettings().setUserAgentString("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); 
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 

    webView.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result) 
     { 
      Log.d(TAG, message); 
      new AlertDialog.Builder(view.getContext()).setMessage(message).setCancelable(true).show(); 
      result.confirm(); 
      return true; 
     } 
    }); 

Respuesta

1

tuve el mismo problema al trabajar con jwplayer, mi conclusión fue que el evento onComplete no es confiable en algunos casos. ¿Puede comparar otros eventos si funciona como el evento onTime?

De lo contrario, utilice el evento onIdle y mida el tiempo restante (getDuration - getPosition) para obtener un evento onComplete personalizado.

+0

Desde entonces, he abandonado este proyecto. Sin embargo, no puede hacer una getDuration - getPosition en un video en tiempo real, si estoy en lo correcto. Al menos en lo que estaba obteniendo. Debería estar usando javascript loco en el lado HTML para obtener la posición del video flash. Sin embargo, la solución onIdle parece buena, puede probarla y ver si la soluciona. –

2

se puede hacer referencia al código de abajo para JWPlayer a WEBVIEW

private void createVideoHtml(File flvDirectory, File htmlFile, String videofilename) 
{ 
    String htmlPre = "<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"></head><body style='margin:0; padding:0;'>"; 
    String htmlCode = 
     "<script type='text/javascript' src='"+ flvDirectory.getAbsolutePath() + "/jwplayer.js'></script>" + 
     "<div id='mediaspace'>EZ Stream TV FLV Player</div>" + 
     "<script type='text/javascript'>" + 
     "jwplayer('mediaspace').setup({" + 
     "'flashplayer': '"+ flvDirectory.getAbsolutePath() + "/player.swf', 'file': '" + videofilename + "', 'backcolor': 'FFFFFF', 'frontcolor': '000000', 'lightcolor': '000000'," + 
     "'screencolor': '000000', 'volume': '100', 'autostart': 'true', 'mute': 'false', 'quality': 'false', 'controlbar': 'bottom', 'width': '100%', 'height': '100%'," + 
     "events: { " + 
     "onComplete: function() { alert('COMPLETED');}" + 
     "}});" + 
     "</script>"; 
    String htmlPost = "</body></html>"; 
    String finalHTML = htmlPre + htmlCode + htmlPost; 

    try { 
     FileWriter f = new FileWriter(htmlFile); 
     PrintWriter p = new PrintWriter(f); 
     p.print(finalHTML); 
     p.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

webView = (WebView)findViewById(R.id.web_player); 
webView.getSettings().setBuiltInZoomControls(false); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.getSettings().setLoadsImagesAutomatically(true); 
webView.getSettings().setPluginsEnabled(true); 
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
webView.getSettings().setAllowFileAccess(true); 
webView.setInitialScale(60); 
webView.setBackgroundColor(Color.BLACK); 
getWindow().addFlags(128); 
webView.getSettings().setUserAgentString("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); 
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 

webView.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result) 
    { 
     Log.d(TAG, message); 
     new AlertDialog.Builder(view.getContext()).setMessage(message).setCancelable(true).show(); 
     result.confirm(); 
     return true; 
    } 
}); 
+0

@Lando ¿Necesito incluir cualquier biblioteca para implementar JWPlayer en mi aplicación de Android? –

+0

Si desea una implementación nativa, creo que deberá trabajar con [Android-SDK] (http://www.jwplayer.com/wp-content/uploads/Android-SDK-Overview.pdf), de lo contrario, utilice la el fragmento HTML + JS predeterminado debería funcionar como en el ejemplo anterior. Estoy seguro de que @ ethan-jwplayer puede darte una respuesta más completa :). – Lando

+0

Además, si necesita una respuesta más detallada, es mejor publicar una [nueva pregunta] (http://stackoverflow.com/questions/ask) en lugar de utilizar los comentarios. – Lando