【问题标题】:JWPlayer Javascript API for Android WebviewJWPlayer Javascript API for Android Webview
【发布时间】:2011-08-09 21:50:04
【问题描述】:

我正在尝试让 JWPlayer 在播放本地视频的 Flash 播放器发生一些特定事件时返回警报。如果您从下面的代码中注意到,onComplete,JWPlayer 应该返回一个警报,然后可以由 setWebChromeClient 的 onJsAlert 拦截该警报,以便我可以使用该信息进行处理。我做错了吗?

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

对于那些好奇我为什么要生成 HTML 文件而不是仅仅从资产中移动的那些人 - 在搜索 Internet 以弄清楚如何让本地 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;
        }
    });

【问题讨论】:

    标签: javascript android jwplayer


    【解决方案1】:

    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 我需要在我的 android 应用程序中包含任何用于实现 JWPlayer 的库吗?
    • 如果你想要一个本机实现,我相信你需要使用Android-SDK,否则使用默认的 HTML+JS sn-p 应该像上面的例子一样工作。我相信@ethan-jwplayer 可以给你一个更完整的答案:)。
    • 另外,如果您需要更详细的答案,最好发new question 而不是使用 cmets。
    • 这无需在本地添加任何其他库即可工作。谢谢
    【解决方案2】:

    我在使用 jwplayer 时遇到了同样的问题,我的结论是 onComplete 事件在某些情况下是不可信的。 你能对其他事件进行基准测试吗?像 onTime 事件一样工作?

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

    【讨论】:

    • 我已经放弃了这个项目。但是,如果我是正确的,您不能对流式视频执行 getDuration - getPosition。至少就我所得到的而言。它应该在 HTML 端使用一些疯狂的 javascript 来获取 Flash 视频位置。但是,onIdle 解决方案似乎是一个不错的解决方案,请随意尝试,看看是否能解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多