JWPlayer Javascript API 适用于 Android Webview

22
我正在尝试让JWPlayer在本地视频播放时返回一些特定事件的警报。从下面的代码中,可以看到当onComplete发生时,JWPlayer应该返回一个警报,然后可以通过setWebChromeClient的onJsAlert拦截该信息,以便我可以处理这些信息。我做错了什么吗?
这里可能有一个原因,我可以在这里找到:JWplayer Javascript interaction not working。它正在本地加载,有没有办法绕过这个问题?通过调用localhost来加载是否更容易?那是可能的吗?
对于那些好奇为什么我要生成HTML文件而不是将一个文件从资产移动到另一个位置的人——在搜索互联网以弄清如何在本地正确运行FLV播放器后,最好的选择是使用自定义信息生成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并处理JavaScript警报的代码:

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;
        }
    });
2个回答

3
您可以参考下面的代码来将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;
    }
});

@Lando 我需要在我的安卓应用中包含任何库才能实现JWPlayer吗? - Pravinsingh Waghela
如果你想要本地实现,我相信你需要使用Android-SDK,否则使用上面的默认HTML+JS代码片段应该可以工作。我相信@ethan-jwplayer可以给你一个更完整的答案 :)。 - Lando
如果您需要更详细的答案,最好是发布一个新问题(http://stackoverflow.com/questions/ask),而不是使用评论。 - Lando
这个可以在不添加任何本地库的情况下工作。谢谢。 - MindRoasterMir

1

我在使用jwplayer时遇到了同样的问题,我的结论是在某些情况下onComplete事件是不可靠的。

你能测试其他事件是否像onTime事件那样可靠吗?否则,使用onIdle事件并测量剩余时间(getDuration - getPosition)以获得自定义的onComplete事件。


我已经放弃了这个项目。然而,如果我没记错的话,在流媒体视频上你不能执行getDuration - getPosition操作。至少在我得到的东西上是这样的。它应该使用一些疯狂的HTML侧面的javascript来获取flash视频位置。然而,onIdle解决方案似乎是一个不错的选择,随时可以尝试并查看是否可以解决问题。 - Rijvi Rajib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接