1.webView播放网络视频时,有些视频源点击全屏时无反应,经过反复查验探索,原因是某些厂商写的页面不规范导致。
通过阅读官方文档得知 应用如果需要支持HTML5的video标签,必须打开硬件加速。我们只需要在Application标签或者相应Activity标签下添加android:hardwareAccelerated="true"
即可。接着为了支持全屏,需要重写WebChromeClient
的onShowCustomView()
和onHideCustomView()
方法,这两个方法缺一不可。
大概就是这样:
private class CustomWebViewChromeClient extends WebChromeClient{
// 横屏在这里操作
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
fullScreen();
mWebView.setVisibility(View.GONE);
mVideoContainer.setVisibility(View.VISIBLE);
mVideoContainer.addView(view);
mCallBack=callback;
super.onShowCustomView(view, callback);
}
//竖屏在这里操作
@Override
public void onHideCustomView() {
fullScreen();
if (mCallBack!=null){
mCallBack.onCustomViewHidden();
}
mWebView.setVisibility(View.VISIBLE);
mVideoContainer.removeAllViews();
mVideoContainer.setVisibility(View.GONE);
super.onHideCustomView();
}
}
private void fullScreen() {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
最后别忘记处理屏幕旋转,否则横竖屏切换会重新走一遍生命周期。通过在一些主流视频网站上的测试,在爱奇艺,土豆,芒果TV,PPTV等可正常全屏,在腾讯,乐视,BiliBili,Acfun等网站仍然无法全屏。通过日志我们可以发现,根本没有回调onShowCustomView这个方法,所以没有执行相应代码。为什么呢这是个前端问题时间太久不记得是哪个方法了 总之是他们没调用规则上的方法,所以我们需要注入JS。
注入这段JS:
"javascript:document.getElementsByClassName('" + tag + "')[0].addEventListener('click',function(){onClick.fullscreen();return false;});"
tag是Class标识,onClick.fullscreen()是我自己本地定义的方法。那么如何注入这段js代码呢?我们只需要重写WebClient的onPageFinished()
方法,如下所示:
private class CustomWebClient extends WebViewClient{
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String js=TagUtils.getJs(url);
view.loadUrl(js);
}
}
private class JsObject{
@JavascriptInterface
public void fullscreen(){
//监听到用户点击全屏按钮
fullScreen();
}
}
mWebView.addJavascriptInterface(new JsObject(),"onClick");
这样就可以实现上述几个网站的全屏播放了。 经测试,腾讯和BiliBili没有问题了,乐视和Acfun仍然不可以全屏,即使已经找到了全屏按钮的Class标识。哪位大仙可以提供一个解释 不胜感激。 下面给出一些我收集的几个视频网站的全屏按钮Class标识:
public static String getTagByUrl(String url) {
if (url.contains("qq")) {
return "tvp_fullscreen_button"; // http://m.v.qq.com
} else if (url.contains("youku")) {
return "x-zoomin"; // http://www.youku.com
} else if (url.contains("bilibili")) {
return "icon-widescreen"; // http://www.bilibili.com/mobile/index.html
} else if (url.contains("acfun")) {
return "controller-btn-fullscreen"; //http://m.acfun.tv 无效
} else if (url.contains("le")) {
return "hv_ico_screen"; // http://m.le.com 无效
}
return "";
}