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.
- Dipaly farsi texto en la web de android (para los teléfonos que no apoyan farsi)
- Método restorePicture de WebView - Impedir que la vista web vuelva a cargar la página
- Android cómo cambiar los conjuntos de cifrado SSL predeterminados para WebView HTTPS
- Android: guarda el nombre de usuario y la contraseña de WebView (como Google Chrome)
- Android, Webview, obtener datos de formulario enviados
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.
- problema de base de datos de acceso a HTML5 WebView HTML
- Directamente poner código html en un WebView (Android)
- La altura de la webview crece indefinidamente dentro de un nestedScrollView
- IScroll no funciona en android a menos que realice un cambio de orientación y regrese
- Habilitar el botón Atrás en WebView
- Cómo configurar el color de fondo de un WebView a un valor hexadecimal?
- Cómo llamar al método Javascript desde la vista web en Android
- Lógica para usar varias vistas web en TabLayout para manejar problemas de memoria
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>