2011-08-09 60 views
20

我试图让JWPlayer在播放本地视频的Flash播放器发生一些特定事件时返回警报。如果你注意到了下面的代码,onComplete,JWPlayer应该返回一个警报,然后可以通过setWebChromeClient的onJsAlert来截获警报,这样我就可以用这些信息来做这些事情。难道我做错了什么?适用于Android的JWPlayer JavaScript API Webview

一个可能的原因,我可以在这里找到:JWplayer Javascript interaction not working它被本地加载。有什么办法可以绕过这个问题吗?通过调用localhost以某种方式加载会更容易吗?这甚至有可能吗?

对于那些你很好奇,为什么我生成一个HTML文件,而不是仅仅有从资产一个举动 - 在网上淘后弄清楚如何让本地视频播放器正常工作,最好的选择是产生包含自定义信息的HTML文件,并将该文件写入FLV所在的目录(即FileWriter函数)。对于JWPlayer

HTML代码中嵌入:

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和处理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; 
     } 
    }); 

回答

1

与jwplayer工作时我有同样的问题,我的结论是,onComplete时间在某些情况下是不可信的。 你可以基准其他事件像onTime事件一样工作吗?

否则使用onIdle事件并测量剩余时间(getDuration - getPosition)以获取自定义的onComplete事件。

+0

因为我已经放弃了这个项目。但是,如果我是正确的,则无法在流视频上执行getDuration - getPosition。至少在我得到什么。它应该在HTML端使用一些疯狂的JavaScript来获得Flash视频位置。然而,onIdle解决方案似乎是一个很好的解决方案,请随时尝试一下,看看是否能解决这个问题。 –

2

您可以参考下面的代码JWPlayer到的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是否需要包含用于实现JWPlayer的任何库到我的android应用程序? –

+0

如果你想要一个本地实现,我相信你需要使用[Android-SDK](http://www.jwplayer.com/wp-content/uploads/Android-SDK-Overview.pdf),否则使用默认的HTML + JS片段应该像上面的例子一样工作。我相信@ ethan-jwplayer可以给你更完整的答案:)。 – Lando

+0

此外,如果您需要更详细的答案,最好发布[新问题](http://stackoverflow.com/questions/ask)而不是使用评论。 – Lando