WebView Video Play - litonghui/TechBlog GitHub Wiki

通过WebView 加载H5 页面,如果遇到视频播放,需要注意一些问题

1. 网络切换到移动网络时候如何优雅的提示用户

1). 如果H5 为自己前端开发同学开发的,可以通过本地native 方法与 JS 方法通信,广播监听网络切换为移动网络状态,可以调用Js 提供方法,具体操作交个H5前端开发同学。
2). 如果H5 为第三方开发,需要通过查找标签的方法调用相应的video方法操作。具体如:
if (type == ConnectivityManager.TYPE_MOBILE){// 网络切换为移动网络调用该函数
    autoPause();
    new AlertDialog.Builder(mContext)
            .setTitle("提醒")
            .setMessage("网络切换为移动网络")
            .setPositiveButton(android.R.string.ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            autoPlay();
                        }
                    })
            .setNegativeButton(android.R.string.cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            autoStop();
                        }
                    })
            .create()
            .show();
}

private void autoPause() {
    String js = "javascript: var el = document.getElementById('player');if (el) {var elv = el.getElementsByTagName('video')[0];"
            + "elv.pause(); }";
    mWebView.loadUrl(js);
}

private void autoPlay() {
    String js = "javascript: var el = document.getElementById('player');if (el) {var elv = el.getElementsByTagName('video')[0]; "
            + "elv.play(); }";
    mWebView.loadUrl(js);
}

private void autoStop() {
    String js = "javascript: var el = document.getElementById('player');if (el) {var elv = el.getElementsByTagName('video')[0];elv.load();elv.preload = 'none';elv.pause()}";
    mWebView.loadUrl(js);
}
补充解释,采用上述方法的原因,在调用网络切换弹窗时候想到了js 的重写 confirm() 和 alter(),但是测试放心当调用:mWebView.loadUrl(“javascript:confirm()”) ,如果视频已经播放会造成视频重新从头开始。不符合用户习惯,如果用户选择继续播放不能从当前位置接着播放。
3).有个想法希望在Webview打开页面后自动播放视频,出现如下问题,
  Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture
通过查找发现webview,发现webSettings 的 setMediaPlaybackRequiresUserGesture() 默认是true
/**
 * Sets whether the WebView requires a user gesture to play media.
 * The default is true.
 *
 * @param require whether the WebView requires a user gesture to play media
 */
public abstract void setMediaPlaybackRequiresUserGesture(boolean require);
解决方法:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        webSettings.setMediaPlaybackRequiresUserGesture(false);
}