2011-08-09 7 views
20

Staram się, aby JWPlayer zwrócił alert, gdy kilka konkretnych zdarzeń stanie się z odtwarzacza Flash odtwarzającego wideo lokalne. Jeśli zauważysz z poniższego kodu, onComplete, JWPlayer powinien zwrócić alert, który może zostać przechwycony przez onJsAlert z setWebChromeClient, dzięki czemu mogę robić rzeczy z tymi informacjami. czy robię coś źle?JWPlayer JavaScript API dla Androida Webview

Możliwy powód, mogę znaleźć tutaj: JWplayer Javascript interaction not working, który jest ładowany lokalnie. Czy istnieje sposób ominięcia tego problemu? Czy byłoby łatwiej ładować się w jakiś sposób przez wywołanie localhost? Czy to w ogóle jest możliwe?

Dla tych, którzy ciekawi, dlaczego generuję plik HTML zamiast jednego ruchu z zasobów - po wyszukaniu Internetu, aby dowiedzieć się, jak sprawić, by lokalny gracz flv działał poprawnie, najlepszą opcją było wygenerowanie Plik HTML z niestandardowymi informacjami i zapisz plik w tym samym katalogu co FLV (stąd funkcja FileWriter).

kod HTML JWPlayer osadzić:

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

Kod WebView i obsługi alert 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; 
     } 
    }); 

Odpowiedz

1

miałem ten sam problem podczas pracy z jwplayer, mój wniosek był taki, że zdarzenie onComplete w niektórych przypadkach nie jest zaufany. Czy testy porównawcze innych zdarzeń działają tak, jak w przypadku zdarzenia onTime?

W przeciwnym razie użyj zdarzenia OnIdle i zmierz pozostały czas (getDuration - getPosition), aby uzyskać niestandardowe zdarzenie onComplete.

+0

ja już od porzucił ten projekt. Jednak nie można zrobić getDuration - getPosition na streaming wideo, jeśli mam rację. Przynajmniej na tym, co dostawałem. Powinien używać jakiegoś zwariowanego javascript po stronie HTML, aby uzyskać pozycję wideo flash. Jednak rozwiązanie onIdle wydaje się być dobre, możesz go wypróbować i sprawdzić, czy to rozwiązuje. –

2

można zapoznać się z poniższym kodzie dla JWPlayer do 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 Czy muszę dołączyć do biblioteki dowolną bibliotekę do implementacji JWPlayera w mojej aplikacji na Androida? –

+0

Jeśli chcesz natywną implementację, uważam, że będziesz musiał pracować z [Android-SDK] (http://www.jwplayer.com/wp-content/uploads/Android-SDK-Overview.pdf), w przeciwnym razie używaj domyślny fragment kodu HTML + JS powinien działać tak, jak w powyższym przykładzie. Jestem pewien, że @ ethan-jwplayer może dać ci pełniejszą odpowiedź :). – Lando

+0

Także jeśli potrzebujesz bardziej szczegółowej odpowiedzi, lepiej zamiast tego używać postów [nowe pytanie] (http://stackoverflow.com/questions/ask). – Lando

Powiązane problemy