JWPlayer Javascript API для Android Webview

Я пытаюсь заставить JWPlayer возвращать предупреждение, когда происходит несколько определенных событий из флеш-плеера, воспроизводящего локальное видео. Если вы заметили из приведенного ниже кода, onComplete, JWPlayer должен возвращать предупреждение, которое затем может быть перехвачено onJsAlert из setWebChromeClient, чтобы я мог что-то делать с этой информацией. Я делаю что-то неправильно?

Возможную причину я могу найти здесь: JWplayer Javascript не работает, что он загружается локально. Есть ли способ обойти эту проблему? Было бы проще как-то загрузиться, вызвав localhost? Это вообще возможно?

Для тех из вас, кому интересно, почему я генерирую HTML-файл, а не просто делаю один ход из ресурсов - после рыскания в Интернете, чтобы выяснить, как заставить локальный проигрыватель FLV работать правильно, лучшим вариантом было создать HTML-файл с пользовательскую информацию и записать файл в тот же каталог, что и FLV (отсюда и функция FileWriter).

HTML-код для встраивания JWPlayer:

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();
    } 
}

Код для веб-просмотра и обработки предупреждения 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;
        }
    });

person Rijvi Rajib    schedule 09.08.2011    source источник


Ответы (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;
    }
});
person Karthik    schedule 19.11.2012
comment
@Lando Нужно ли мне включать какую-либо библиотеку для реализации JWPlayer в мое приложение для Android? - person Pravinsingh Waghela; 30.12.2014
comment
Если вам нужна нативная реализация, я считаю, что вам нужно будет работать с Android-SDK, в противном случае использование фрагмента кода HTML+JS по умолчанию должно работать, как в приведенном выше примере. Я уверен, что @ethan-jwplayer может дать вам более полный ответ :). - person Lando; 07.01.2015
comment
Также, если вам нужен более подробный ответ, лучше опубликовать новый вопрос вместо использования комментариев. - person Lando; 07.01.2015
comment
это работает без добавления какой-либо дополнительной библиотеки локально. Благодарность - person MindRoasterMir; 03.04.2019

У меня была такая же проблема при работе с jwplayer, я пришел к выводу, что в некоторых случаях событию onComplete нельзя доверять. Можете ли вы сравнить другие события, которые работают так же, как событие onTime?

В противном случае используйте событие onIdle и измерьте оставшееся время ( getDuration - getPosition ), чтобы получить пользовательское событие onComplete.

person Chris    schedule 01.11.2012
comment
С тех пор я отказался от этого проекта. Однако вы не можете использовать getDuration - getPosition для потокового видео, если я прав. По крайней мере, на то, что я получал. Он должен использовать какой-то сумасшедший javascript на стороне HTML, чтобы получить позицию флэш-видео. Тем не менее, решение onIdle кажется хорошим, не стесняйтесь попробовать его и посмотреть, исправит ли оно проблему. - person Rijvi Rajib; 02.11.2012