1.WebView基础使用
代码:
//获取配置,设置webview
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//在当前的webview显示网页,否则会调用系统默认的浏览器打开网页
return false;
}
});
webView.loadUrl("http://www.baidu.com");
2.视频全屏
项目中webview打开的网页嵌有视频,例如爱奇艺的网页,但是全屏按钮无效,查看官方文档后发现
为支持在线H5视频播放,必须开启硬件加速,并且设置WebChromeClient
,全屏模式还需要实现onShowCustomView()
和onHideCustomView()
。
2.1.打开硬件加速
在Application
或者相应Activity
标签下添加android:hardwareAccelerated="true"
即可,
2.2.实现的两个方法
onShowCustomView()
在显示全屏的时候调用,并将显示参数view
,回调接口在取消全屏的时候要调用callback.onCustomViewHidden()
。
onHideCustomView()
在取消全屏的时候调用。
只需要在两个重写方法里处理要显示的view的逻辑即可。
布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- 添加和删除要全屏显示的view,默认隐藏 -->
<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="gone"/>
<!-- 正常显示网页的webview -->
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
代码:
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
webView.setVisibility(View.GONE); //隐藏webview,显示ll并添加要全屏的view
ll.setVisibility(View.VISIBLE);
ll.addView(view);
viewCallback = callback; //获取callback
super.onShowCustomView(view, callback);
}
@Override
public void onHideCustomView() {
ll.removeAllViews(); //ll删除全屏view,并隐藏,再显示webview
ll.setVisibility(View.GONE);
webView.setVisibility(View.VISIBLE);
if (viewCallback != null)
viewCallback.onCustomViewHidden(); //接口调用取消全屏
super.onHideCustomView();
}
});
webView.loadUrl("http://www.iqiyi.com/v_19rrmucyoc.html");
但这样的效果只是竖屏的全屏,需要横屏处理。
注意:横竖屏处理要在manifests文件里的相应activity标签中声明android:configChanges="keyboardHidden|orientation|screenSize"
,否则页面会销毁重建,视频播放进度就重置了,特别注意4.0以后必须加上screenSize
代码:
private void changeOrientation() {
int orientation = getResources().getConfiguration().orientation;
setRequestedOrientation(orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ?
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
在调用两个实现方法之前都调用横竖屏转换的方法即可。
3.拦截请求
WebViewClient
中重写shouldOverrideUrlLoading
方法可以拦截页面内的url请求
返回true表示系统处理请求,false表示本地webview处理请求
代码:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//根据url处理,支付跳转原生页面或者其他逻辑
return false;
}
});