環境
症状
WebViewで表示しているHTML内の<video>
のフルスクリーンボタンを押した時に以下の症状が発生する。
- フルスクリーンにならない。動画はそのまま再生されている。
- 動画の表示領域の外側のタップが反応しなくなる。
デバッガのLayout Inspectorを使用して確認すると、フルスクリーンのviewは確かに表示されている。ただ、そのviewが表示している内容が元の画面と同じになっていると思われる。view上では動画の表示領域はなぜか元のサイズのままでフルスクリーンになっていない。そのため、動画の表示領域外はタップしても反応しなくなっている。
解決方法
WebView内でフルスクリーンを行うには、WebViewClientを継承してonShowCustomViewとonHideCustomViewを実装したクラスをWebViewにsetWebChromeClient()
でセットし、onShowCustomViewで渡されたviewをアプリ上で表示する必要がある。
この問題を解決するにはviewを表示する際、少し時間を置いてから表示するようにする。以下の例ではMyWebChromeClientの初期化時に指定したRelativeLayout
上にフルスクリーンのviewを表示している。
/** * "<video>"タグののフルスクリーンをサポートするためのWebChromeClientクラス */ public class MyWebChromeClient extends WebChromeClient { private ViewGroup mVideoContainer; private View mVideoView; MyWebChromeClient(RelativeLayout videoContainer) { this.mVideoContainer = videoContainer; } @Override public void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); mVideoView = view; // 元の処理。これだと正常に表示されない。 // mVideoContainer.addView(mVideoView); // 以下のように少し時間を置くと正常に表示される。 new Handler().postDelayed(new Runnable() { @Override public void run() { mVideoContainer.addView(mVideoView); } }, 300); } @Override public void onHideCustomView() { super.onHideCustomView(); mVideoContainer.removeView(mVideoView); mVideoView = null; } }