Android WebView con un video de youtube incorporado, botón de pantalla completa congela el video

Tengo una vista web de Android que carga un blog de WordPress. Algunas publicaciones de blog contienen videos de youtube que me gustaría que el usuario pueda hacer a pantalla completa si así lo desean. El problema es que el botón de pantalla completa HTML5 no hace nada cuando se hace clic en él, sino que se congela la vista. ¿Algunas ideas?

Esto es algo que me he pasado el último día arrancándome el pelo. Basado en varios bits de código de toda la web, he logrado que funcione.

En primer lugar, debe crear una clase WebChromeClient personalizada, que implemente los métodos onShowCustomView y 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); } } } 

Básicamente, lo que está sucediendo aquí es cuando se presiona el botón de pantalla completa, estamos creando una nueva vista para mantener el video y ocultar la vista principal. Y luego, cuando se cierra la pantalla completa, hacemos lo contrario: deshacerse de la nueva vista y mostrar la vista original.

También deberá agregar todas esas propiedades a su clase de actividad:

 private MyWebChromeClient mWebChromeClient = null; private View mCustomView; private RelativeLayout mContentView; private FrameLayout mCustomViewContainer; private WebChromeClient.CustomViewCallback mCustomViewCallback; 

Y es probable que desee cerrar el video a pantalla completa cuando se presiona el botón Atrás:

 @Override public void onBackPressed() { if (mCustomViewContainer != null) mWebChromeClient.onHideCustomView(); else if (myWebView.canGoBack()) myWebView.goBack(); else super.onBackPressed(); } 

Entonces, solo es cuestión de usar su nueva clase cuando cree su vista web:

 myWebView = (WebView) findViewById(R.id.webView1); mWebChromeClient = new WMWebChromeClient(); myWebView.setWebChromeClient(mWebChromeClient); 

Esto funciona para mí en Android 4.x. No estoy seguro acerca de las versiones anteriores, ya que mi aplicación no está orientada a ellas.

Encontré estos enlaces particularmente útiles: WebView y HTML5

Puede iniciar una aplicación de YouTube externa cuando llame a la URL de información de video si no es importante mostrar el video de YouTube directamente en la aplicación.

Para capturar la URL de información de video, debe onLoadResource método de carga de onLoadResource :

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