los vídeos de iframe no irán al modo de pantalla completa en la vista web de Android

Actualmente estoy trabajando en una aplicación de Android basada en un sitio web. La aplicación iOS ya existe, y tengo que respetar algunos códigos para la uniformidad.

Todo está casi terminado, pero acabo de descubrir un problema interesante: cuando se usa la vista web (no tengo ningún control en la página que se muestra) para una página con un video iframe (Youtube, Dailymotion), no pasará a pantalla completa , aunque estoy presionando el botón del reproductor.

Ya he probado casi todo lo que se encuentra aquí, pero sólo se refiere a las aplicaciones en las que sé qué páginas es necesario mostrar.

Aquí está el código para la parte webActivity de la aplicación:

public class WebActivity extends Activity { String targetURL = ""; String title = ""; WebView wv; @Override public void onResume() { super.onResume(); CookieSyncManager.getInstance().startSync(); } @Override public void onPause() { super.onPause(); CookieSyncManager.getInstance().stopSync(); } /** Called when the activity is first created. */ @SuppressLint("SetJavaScriptEnabled") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_PROGRESS); //getWindow().requestFeature(Window.FEATURE_NO_TITLE); CookieSyncManager.createInstance(getApplicationContext()); CookieSyncManager.getInstance().startSync(); CookieManager.getInstance().setAcceptCookie(true); /** * TODO: WebView Cookie management. * Right now, a cookie is hardcoded here into the WebView instead of getting it from the API called by HttpClient when retrieving the JSON. * Need to make things cleaner. */ CookieManager.getInstance().setCookie("http://www.blabla.fr/mobile/","gbapi=1; Domain=.www.blabla.fr"); /** * Get parameters */ Bundle b = getIntent().getExtras(); if(b != null) { targetURL = b.getString("url"); title = b.getString("title"); } setTitle(title); setContentView(R.layout.activity_webview); wv = (WebView) findViewById(R.id.webview); WebSettings wvSettings = wv.getSettings(); // WebView options wvSettings.setDefaultTextEncodingName("utf-8"); wvSettings.setJavaScriptEnabled(true); wvSettings.setPluginState(PluginState.ON); wvSettings.setJavaScriptCanOpenWindowsAutomatically(true); wvSettings.setBuiltInZoomControls(true); final Activity activity = this; wv.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { activity.setProgress(progress * 100); } }); wv.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(activity, "Oh snap! " + description, Toast.LENGTH_SHORT).show(); } }); wv.loadUrl(targetURL); } } 

Gracias por cualquier ayuda.

Tendrá que crear un WebChromeClient personalizado que maneje ambas versiones de onShowCustomView (una nueva versión de esta devolución de llamada se introdujo en el nivel 14 de la API), así como onHideCustomView. Esencialmente lo que sucederá es que cuando intentas reproducir vídeos a pantalla completa, se te dará una vista que es una variación de VideoView. Debe adjuntarlo a un FrameLayout de pantalla completa y pegarlo en la raíz de la jerarquía de diseño para superponer toda la pantalla. Una vez que haya terminado, debe quitarlo de nuevo.

Esta es una versión que estoy usando para reproducir videos

 private class DerpChromeClient extends WebChromeClient implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener { //@Override public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) { log.warn("onShowCustomView"); showCustomView(view, callback); } private View mVideoProgressView; @Override public void onHideCustomView() { super.onHideCustomView(); activity.removeFullscreenView(); webView.setVisibility(View.VISIBLE); try { mCustomViewCallback.onCustomViewHidden(); } catch (NullPointerException npe) { // occasionally Android likes to freak out and throw an unhandled NPE if it can't play the video // therefore we are not going to do anything but eat this exception so it fails gracefully } mCustomView = null; mVideoView = null; } @Override public void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); log.warn("onShowCustomView"); showCustomView(view, callback); } private void showCustomView(View view, CustomViewCallback callback) { if (mCustomView != null) { callback.onCustomViewHidden(); return; } mCustomView = view; mCustomViewCallback = callback; webView.setVisibility(View.GONE); if (view instanceof FrameLayout) { if (((FrameLayout)view).getFocusedChild() instanceof VideoView) { mVideoView = (VideoView)((FrameLayout)view).getFocusedChild(); } } view.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); view.setBackgroundColor(Color.BLACK); activity.displayFullscreenView(view); } @Override public boolean onConsoleMessage(ConsoleMessage cm) { log.warn("Console Message: " + cm.message() + " on line " + cm.lineNumber() + " of " + cm.sourceId()); return super.onConsoleMessage(cm); } @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if (newProgress < 100) { if (loadingProgress.getVisibility() == ProgressBar.GONE) { loadingProgress.setVisibility(ProgressBar.VISIBLE); } loadingProgress.setProgress(newProgress); } else if (newProgress >= 100) { loadingProgress.setVisibility(ProgressBar.GONE); } } @Override public View getVideoLoadingProgressView() { if (mVideoProgressView == null) { LayoutInflater inflater = LayoutInflater.from(KnowledgeBaseFragment.this.getActivity().getApplicationContext()); mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null); } return mVideoProgressView; } @Override public boolean onError(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub return false; } @Override public void onCompletion(MediaPlayer mp) { this.onHideCustomView(); } } 

Tenga en cuenta que estoy haciendo esto dentro de un fragmento, por lo que para que sea verdadera pantalla completa tuve que estrecharlo con la actividad para que pudiera adjuntar el FrameLayout en la raíz de toda la jerarquía de vista, no sólo el fragmento.

Estas son las funciones:

 @Override public void displayFullscreenView(View customView) { parentLayout.addView(customView); this.customView = customView; } @Override public void removeFullscreenView() { if (customView != null) { customView.setVisibility(View.GONE); parentLayout.removeView(customView); } customView = null; } 

Aquí hay otra pregunta como la tuya: WebView y HTML5 <video>

  • Cómo hacer Android Webview Background Transparente en KITKAT (4.4)
  • WebView con cliente HTTP personalizado
  • Android: Cómo hacer referencia a imágenes de activos desde una página HTML remotamente cargada en webview
  • Detectar el cambio de ubicación de la URL de webview de Android
  • Android webview tiene borde blanco alrededor de él y cómo puedo deshacerme de él?
  • ¿Cómo obtener bordes y tamaños precisos en la vista Web de Android KitKat (Android Chrome) en Nexus 7?
  • Restaurar historial y página actual al reanudar la visualización web
  • Obtener datos POST desde la vista Web de Android
  • Android CustomWebChromeClient openFileChooser Cambiar el tamaño de la imagen antes de subir
  • Android WebView desplazamiento suave
  • android-O: caída de la aplicación con la vista web
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.