2012-01-27 10 views
13

Si tratta di caricare video di YouTube utilizzando l'ultimo formato incorporato (iframe) all'interno di una webview.La webview Android non può rendere il video di YouTube incorporato tramite iframe

esempio del formato iframe embed

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

testare il codice su Android 2.3.3 & 3.2 dispositivi (HTC Desire & Asus Transformer), la WebView avrebbe mostrato solo un rettangolo nero.

ho provato un simile embed da vimeo

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

In 2.3, video riprodotto correttamente
In 3.2, un rettangolo nero balenò e scomparve, la zona iframe è vuota.

Infine, se viene utilizzato il vecchio formato di incorporamento (utilizzando il tag dell'oggetto), il video viene visualizzato correttamente all'interno della visualizzazione Web in 2.3.3 & 3.2.

Ho controllato questioni connesse e aggiunto

android:hardwareAccelerated="true" 

nell'applicazione e/o tag attività, ma ancora non il video in entrambi i dispositivi 2.3 & 3.2.

Questo è un grosso problema perché più siti Web utilizzano ora il formato più recente (iframe) per incorporare i loro video su YouTube. Squadra Android/Youtube, dai un'occhiata a questo problema.

+0

Si dovrebbe questa risposta: https://stackoverflow.com/a/24592012/2371425 come effettivamente risolve il problema. – Sakiboy

risposta

11

I browser Android sono estremamente buggy per quanto riguarda la riproduzione e l'incorporamento di video. Semplicemente non funziona su tutti i dispositivi. Cercare di farlo funzionare è solo una perdita di tempo. Il mio suggerimento è di non provare a includere ma semplicemente fornire una miniatura del video che si collega direttamente alla pagina YouTube o al file h264.

Discussione precedente, con una possibile soluzione.

Google Reader-esque optimizing of WebViews on Android

+0

Hai ragione. Inoltre ho scoperto che l'app si sarebbe incasinata se si ruota il dispositivo quando il video è in riproduzione. Ho finito per utilizzare la soluzione di anteprima e collegamento suggerita. – littlestove

+0

Come si determina quale sia il collegamento a un file youtube o vimeo h264? – cottonBallPaws

+0

Controlla la mia risposta qui sotto. La mia risposta risolve il problema ed è davvero semplice. – Sakiboy

0

Io suggerirei di usare un po 'di codice per rilevare l'ambiente dell'utente ... utilizzare il codice iframe solo per i dispositivi iOS (iPhone, iPod, iPad) e utilizzare il vecchio codice per tutti gli altri.

7

Se si desidera riprodurre i video all'interno del tuo WebView è necessario caricare i dati con un URL di base!

NON fare questo:

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

fare questo, invece:

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

l'URL di base sarà il qualcosa come l'URL "originale" di ciò che si sta visualizzando nel vostro WebView. Quindi diciamo che stai facendo un lettore di notizie, l'url di base WebView's sarà l'url della storia originale.

Buona fortuna!

Ricordarsi inoltre di impostare il WebView ... Come così ...

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

È necessario avere accelerazione hardware attivata nel manifesto (disponibile solo su SDK 14 e sopra).

Es. Accelerazione hardware 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

evitando loadDataWithBaseURL (...) con URL base null ha funzionato per me. Grazie! – IK828

+0

Ci sono voluti giorni per capirlo! Ho pensato che non avrebbe mai funzionato !! – Sakiboy

0

Il presente Codice ha fatto misura esattamente al dispositivo diverso

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

Questo ha funzionato per me- il codice apre sito di YouTube e può giocare i suoi video all'interno 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()); 
Problemi correlati