2012-01-27 9 views
13

Chodzi o ładowanie filmów z YouTube przy użyciu najnowszego osadzonego formatu (iframe) w widoku internetowym.Przeglądarka internetowa na Androida nie może renderować filmów osadzonych w youtube za pomocą iframe

przykład formatu iframe umieszczenia

<iframe width="637" height="358" src="http://www.youtube.com/embed/olC42gO-Ln4?fs=1&amp;feature=oembed" frameborder="0" allowfullscreen=""></iframe> 

testu kod Androida 2.3.3 & 3,2 urządzenia (HTC & Asus transformator), przy czym WebView wykaże jedynie czarny prostokąt.

Próbowałem podobny embed z Vimeo

<iframe src="http://player.vimeo.com/video/35693267" width="640" height="360" frameborder="0"></iframe> 

W 2.3, wideo odtwarzane poprawnie
W 3.2, czarny prostokąt błysnął i zniknął, obszar iframe jest pusty.

Na koniec, jeśli używany jest stary format osadzania (przy użyciu znacznika obiektu), wideo jest wyświetlane poprawnie w widoku strony w obu 2.3.3 & 3.2.

Sprawdziłem pokrewnych pytania i dodaje

android:hardwareAccelerated="true" 

we wniosku i/lub znacznik aktywności ale nadal nie wideo w obu 2,3 ​​& 3,2 urządzeniach.

To poważny problem, ponieważ coraz więcej witryn korzysta z najnowszego formatu (iframe) do osadzenia swoich filmów z YouTube. Zespół Android/Youtube, proszę spojrzeć na ten problem.

+0

Powinieneś tej odpowiedzi: https://stackoverflow.com/a/24592012/2371425 ponieważ faktycznie rozwiązuje problem. – Sakiboy

Odpowiedz

11

Przeglądarki systemu Android są całkowicie błędne, co przychodzi do odtwarzania wideo i osadzania. Po prostu nie działa na różnych urządzeniach. Próba uruchomienia go to tylko strata czasu. Moja sugestia jest taka, że ​​nie próbujesz dołączyć , ale po prostu podaj miniaturę filmu, która bezpośrednio łączy się ze stroną YouTube lub plikiem h264.

Wcześniejsza dyskusja z możliwym rozwiązaniem.

Google Reader-esque optimizing of WebViews on Android

+0

Masz rację. Dowiedziałem się też, że aplikacja będzie zepsuta, jeśli obrócisz urządzenie podczas odtwarzania wideo. Skończyło się na tym, że skorzystałem z sugerowanego rozwiązania dotyczącego miniatur i linków. – littlestove

+0

W jaki sposób ustalasz, jaki link ma do pliku youtube lub vimeo h264? – cottonBallPaws

+0

Sprawdź poniżej swoją odpowiedź. Moja odpowiedź rozwiązuje problem i jest naprawdę prosta. – Sakiboy

0

Proponuję za pomocą kodu w celu wykrycia środowiska użytkownika ... użyć kodu iframe tylko dla urządzeń z systemem iOS (iPhone, iPod, iPad) i używać starego kodu dla każdego innego.

7

Jeśli chcesz odtwarzać filmy w swoim WebView trzeba załadować dane z podstawowego adresu URL!

DONT to zrobić:

mContentWebView.loadDataWithBaseURL(null, webViewContentString, 
      "text/html", "UTF-8", null); 

ROBIĆ TO ZAMIAST:

//veryVeryVery important for playing the videos! 
    mContentWebView.loadDataWithBaseURL(theBaseUrl, webViewConentString, 
      "text/html", "UTF-8", null); 

bazowy adres URL będzie coś jak "pierwotnego" URL tego, co pokazujemy w swojej WebView. Załóżmy, że tworzysz czytnik wiadomości, adres URL bazy WebView's będzie adresem oryginalnej historii.

Powodzenia!

Należy również pamiętać, aby skonfigurować WebView ... Podobnie jak ...

mContentWebView.setWebChromeClient(new WebChromeClient()); 
    mContentWebView.getSettings().setPluginState(WebSettings.PluginState.ON); 
    mContentWebView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND); 
    mContentWebView.setWebViewClient(new WebViewClient()); 
    mContentWebView.getSettings().setJavaScriptEnabled(true); 

Trzeba mieć przyspieszenie sprzętowe włączone w manifeście (dostępna tylko w SDK 14 i powyżej).

Przykł. Akceleracja sprzętowa On:

<application 
    android:name="com.example.app" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:hardwareAccelerated="true"> 
<!-- hardwareAccelerated requires SDK 14 --> 
... 
</application> 
+1

unikanie loadDataWithBaseURL (...) z pustym adresem bazowym pracował dla mnie. Dzięki! – IK828

+0

Zajęło mi dni, aby to zrozumieć! Myślałem, że to nigdy nie zadziała! – Sakiboy

0

Kodeks wykonany dokładnie pasuje do innego urządzenia

webView.setInitialScale(1); 
    webView.setWebChromeClient(new WebChromeClient()); 

    webView.getSettings().setAllowFileAccess(true); 
    webView.getSettings().setPluginState(WebSettings.PluginState.ON); 
    webView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND); 
    webView.setWebViewClient(new WebViewClient()); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setLoadWithOverviewMode(true); 
    webView.getSettings().setUseWideViewPort(true); 
    DisplayMetrics displaymetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int height = displaymetrics.heightPixels; 
    int width = displaymetrics.widthPixels; 

    Log.e(SimpleBillsConstants.SIMPLE_BILLS, width + "-" + height); 

    String data_html = "<!DOCTYPE html><html> <head> <meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"target-densitydpi=high-dpi\" /> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> <link rel=\"stylesheet\" media=\"screen and (-webkit-device-pixel-ratio:1.5)\" href=\"hdpi.css\" /></head> <body style=\"background:black;margin:0 0 0 0; padding:0 0 0 0;\"> <iframe style=\"background:black;\" width=' "+width+"' height='"+height+"' src=\""+ VIDEO_URL+"\" frameborder=\"0\"></iframe> </body> </html> "; 



    webView.loadDataWithBaseURL("http://vimeo.com", data_html, "text/html", "UTF-8", null); 
0

Ten pracował dla mnie- kodu otwiera witrynę YouTube i może odtwarzać swoje filmy wewnątrz WebView:

mWebView = (WebView) findViewById(R.id.webview);  

WebSettings webSettings = mWebView.getSettings(); 
webSettings.setJavaScriptEnabled(true); 


String frameVideo = "<html><body>Youtube video .. <br> <iframe width=\"320\" height=\"315\" src=\"https://www.youtube.com/\" frameborder=\"0\" allowfullscreen></iframe></body></html>"; 

mWebView.loadData(frameVideo, "text/html", "utf-8"); 

mWebView.loadUrl("http://www.youtube.com/"); 

mWebView.setWebViewClient(new WebViewClient()); 
Powiązane problemy