iframe videos won't go fullscreen mode in Android web view
You will need to create a custom WebChromeClient that handles both versions of onShowCustomView (a new version of this callback was introduced in API level 14) as well as onHideCustomView. Essentially what will happen is that when you attempt to play videos fullscreen, you will be given a view that is some variation of VideoView. You need to attach this to a fullscreen FrameLayout and stick it at the root of your layout hierarchy to overlay the entire screen. Once they're done you need to remove it again.
Here is a version I am using to play 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(); }}
Note that I am doing this within a fragment, so to make it truly fullscreen I had to tightly couple it with the activity so it could attach the FrameLayout at the root of the entire view hierarchy, not just the fragment's.
Here are those functions:
@Overridepublic void displayFullscreenView(View customView) { parentLayout.addView(customView); this.customView = customView;}@Overridepublic void removeFullscreenView() { if (customView != null) { customView.setVisibility(View.GONE); parentLayout.removeView(customView); } customView = null;}
Here's another question like yours: WebView and HTML5 <video>