Ho una vista Web Android che carica un blog wordpress. Alcuni post del blog contengono video di YouTube che vorrei che l'utente potesse fare lo schermo intero se lo desidera. Il problema è che il pulsante a schermo intero HTML5 non fa nulla quando viene cliccato, ma blocca la vista. Qualche idea?Android WebView con un video incorporato di YouTube, il pulsante a schermo intero blocca video
risposta
Questo è qualcosa che ho passato l'ultimo giorno o così a strapparmi i capelli. Sulla base di vari pezzi di codice provenienti da tutto il web sono riuscito a farlo funzionare.
Innanzitutto, è necessario creare una classe personalizzata WebChromeClient
, che implementa i metodi onShowCustomView
e onHideCustomView
.
private class MyWebChromeClient extends WebChromeClient {
FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
// if a view already exists then immediately terminate the new one
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mContentView = (RelativeLayout) findViewById(R.id.activity_main);
mContentView.setVisibility(View.GONE);
mCustomViewContainer = new FrameLayout(MainActivity.this);
mCustomViewContainer.setLayoutParams(LayoutParameters);
mCustomViewContainer.setBackgroundResource(android.R.color.black);
view.setLayoutParams(LayoutParameters);
mCustomViewContainer.addView(view);
mCustomView = view;
mCustomViewCallback = callback;
mCustomViewContainer.setVisibility(View.VISIBLE);
setContentView(mCustomViewContainer);
}
@Override
public void onHideCustomView() {
if (mCustomView == null) {
return;
} else {
// Hide the custom view.
mCustomView.setVisibility(View.GONE);
// Remove the custom view from its container.
mCustomViewContainer.removeView(mCustomView);
mCustomView = null;
mCustomViewContainer.setVisibility(View.GONE);
mCustomViewCallback.onCustomViewHidden();
// Show the content view.
mContentView.setVisibility(View.VISIBLE);
setContentView(mContentView);
}
}
}
In sostanza, ciò che sta accadendo qui è quando viene premuto il pulsante a schermo intero, stiamo creando una nuova vista per contenere il video e nascondere la vista principale. E poi, quando lo schermo intero è chiuso, facciamo l'opposto: sbarazzati della nuova vista e visualizzate la vista originale.
Avrai bisogno di aggiungere anche tutte quelle proprietà per la classe di attività:
private MyWebChromeClient mWebChromeClient = null;
private View mCustomView;
private RelativeLayout mContentView;
private FrameLayout mCustomViewContainer;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
E probabilmente vuole rendere chiudere il video a schermo intero quando viene premuto il pulsante indietro:
@Override
public void onBackPressed() {
if (mCustomViewContainer != null)
mWebChromeClient.onHideCustomView();
else if (myWebView.canGoBack())
myWebView.goBack();
else
super.onBackPressed();
}
Poi è solo una questione di usare la vostra nuova classe quando si crea la visualizzazione web:
myWebView = (WebView) findViewById(R.id.webView1);
mWebChromeClient = new WMWebChromeClient();
myWebView.setWebChromeClient(mWebChromeClient);
Funziona per me su Android 4.x. Non sono sicuro delle versioni precedenti poiché la mia app non le ha indirizzate.
Ho trovato questi link particolarmente utili: WebView and HTML5 <video> e http://code.google.com/p/html5webview/source/browse/trunk/HTML5WebView/src/org/itri/html5webview/HTML5WebView.java
È possibile avviare un app YouTube esterno quando si Cath info video URLif non è importante mostrare video di YouTube direttamente nell'applicazione.
per catturare informazioni URL del video, è necessario owerride onLoadResource
metodo:
new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
if (url.startsWith("http://www.youtube.com/get_video_info?")) {
try {
String path = url.replace("http://www.youtube.com/get_video_info?", "");
String[] parqamValuePairs = path.split("&");
String videoId = null;
for (String pair : parqamValuePairs) {
if (pair.startsWith("video_id")) {
videoId = pair.split("=")[1];
break;
}
}
if(videoId != null){
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com"))
.setData(Uri.parse("http://www.youtube.com/watch?v=" + videoId)));
needRefresh = true;
return;
}
} catch (Exception ex) {
}
} else {
super.onLoadResource(view, url);
}
}
}
Bel codice, ma quando premo sul video si inizia anche a giocare in webview, come posso annullarlo? – KiKo
È possibile chiamare WebView.reload(). Ma puoi implementare video a schermo intero direttamente nell'app se non hai bisogno di avviare l'app esterna. –
Come posso farlo ..? Qualche esempio di codice ... – KiKo
Nel codice di esempio, che cosa è mContentView nel contesto di una visione per lo schermo pieno? Immagino che sia una specie di layout che hai gonfiato, ma come hai fatto a schermo intero. Puoi pubblicare l'XML per l'oggetto mContentView? –
'mContentView' è la vista attività principale, che viene nascosta quando il video viene reso a schermo intero. Comunque non sto facendo automaticamente il video a schermo intero; l'utente lo fa (se lo desidera) quando guarda il video. –
@MarkParnell Dai anche i tuoi commenti anche qui http://stackoverflow.com/questions/18533678/playing-youtube-videos-smoothly-in-web-view – anshul