私はこの問題に少なくとも 1 週間取り組んできました。StackOverflow でそれに関するすべての投稿を読みましたが、まだ解決策が見つからず、これは不可能だと考え始めています。
次のようなレイアウトに埋め込まれた Web ビューに HTML を表示したい:
問題は、その HTML コードに HTML5 ビデオが含まれている場合、Android OS のバグが原因でトリミングされることです: Link to bug。
多くの回避策を試しましたが、どれも機能していないようです。私の最後の試みは、Jelly Bean よりも低いデバイスのフルスクリーンでビデオを表示することです (このバージョンのエラーは修正されています)。
表示する必要がある HTML を制御することはできません。そのため、何かを行う唯一の方法は、javascript コードを挿入することです。現在、両方の onShowCustomView を処理してフルスクリーンにしています。
setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (android_sdk < JELLY_BEAN) {
detectVideoOnWebPage();
}
}
});
private void detectVideoOnWebPage() {
// Run javascript code that detects the video end and notifies the
// interface
String js = "javascript:";
js += "_ytrp_html5_video = document.getElementsByTagName('VIDEO')[0];";
js += "if (_ytrp_html5_video !== undefined) {";
{
js += "_ytrp_html5_video.webkitEnterFullScreen();";
js += "_VideoEnabledWebView.notifyVideoPresence();";
js += "function video_start_playing() {";
{
js += "_VideoPlayed.notifyVideoStarted();";
js += "ev.target.removeEventListener('playing', video_start_playing);";
}
js += "}";
js += "ev.target.addEventListener('playing', video_start);";
}
js += "} else if (document.getElementsByTagName('iframe')) {";
{
js += "_VideoEnabledWebView.notifyVideoPresence();";
}
js += "} else {";
{
js += "var handler = function(ev) {";
{
js += "if (ev.target.nodeName.toUpperCase() === \"VIDEO\".toUpperCase()) {";
{
js += "function video_start_playing() {";
{
js += "_VideoPlayed.notifyVideoStarted();";
js += "ev.target.webkitEnterFullScreen();";
}
js += "}";
js += "ev.target.addEventListener('play', video_start_playing);";
js += "_VideoDetected.notifyVideoPresence();";
js += "document.removeEventListener (\"DOMNodeInserted\", handler);";
}
js += "} else {";
{
js += "_ytrp_html5_video = document.getElementsByTagName('VIDEO')[0];";
js += "if (_ytrp_html5_video !== undefined) {";
{
js += "_VideoEnabledWebView.notifyVideoPresence();";
}
}
js += "};";
}
js += "};";
js += "document.addEventListener (\"DOMNodeInserted\", handler);";
}
js += "}";
loadUrl(js);
}
私の目標は:
- html に html5 ビデオが含まれていることを検出します。
- Jelly Bean より前の OS バージョンの場合は、全画面表示を強制します。
今、私は到達しました:
- Ice Cream Sandwich より前のバージョンの iframe 内にない html5 ビデオをフルスクリーン モードで表示します (ICS は webkitEnterFullScreen を無視します)。