implementation 'cn.yc:WebViewLib:1.1.2'
複製代碼
X5WebUtils.init(this);
複製代碼
<BridgeWebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarSize="3dp" />
複製代碼
<X5WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarSize="3dp" />
複製代碼
<可使用ProgressWebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarSize="3dp" />
複製代碼
mWebView.getX5WebChromeClient().setWebListener(interWebListener);
private InterWebListener interWebListener = new InterWebListener() {
@Override
public void hindProgressBar() {
pb.setVisibility(View.GONE);
}
@Override
public void showErrorView() {
//設置自定義異常錯誤頁面
}
@Override
public void startProgress(int newProgress) {
pb.setProgress(newProgress);
}
};
複製代碼
x5WebChromeClient = x5WebView.getX5WebChromeClient();
x5WebChromeClient.setVideoWebListener(new VideoWebListener() {
@Override
public void showVideoFullView() {
//視頻全頻播放時監聽
}
@Override
public void hindVideoFullView() {
//隱藏全頻播放,也就是正常播放視頻
}
@Override
public void showWebView() {
//顯示webView
}
@Override
public void hindWebView() {
//隱藏webView
}
});
複製代碼
@Override
public void onResume() {
super.onResume();
if (mWebView != null) {
mWebView.getSettings().setJavaScriptEnabled(true);
}
}
@Override
protected void onStop() {
super.onStop();
if (mWebView != null) {
mWebView.getSettings().setJavaScriptEnabled(false);
}
}
複製代碼
@Override
protected void onDestroy() {
try {
if (webView != null) {
webView.stopLoading();
webView.destroy();
webView = null;
}
} catch (Exception e) {
Log.e("X5WebViewActivity", e.getMessage());
}
super.onDestroy();
}
複製代碼
mWebView.registerHandler("jsname", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
}
});
複製代碼
function.onCallBack("回調數據");
複製代碼
WebView view = new WebView(context);
view.loadData(htmlString, "text/html", "utf-8");
view.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d("2", view.getContentheight() + "");
}
});
複製代碼
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int contentHeight = webView.getContentHeight();
int viewHeight = webView.getHeight();
}
}, 500);
}
});
複製代碼
/**
* 只有在主頁面加載出現錯誤時,纔會回調這個方法。這正是展現加載錯誤頁面最合適的方法。
* 然而,若是無論三七二十一直接展現錯誤頁面的話,那頗有可能會誤判,給用戶形成常常加載頁面失敗的錯覺。
* 因爲不一樣的WebView實現可能不同,因此咱們首先須要排除幾種誤判的例子:
* 1.加載失敗的url跟WebView裏的url不是同一個url,排除;
* 2.errorCode=-1,代表是ERROR_UNKNOWN的錯誤,爲了保證不誤判,排除
* 3failingUrl=null&errorCode=-12,因爲錯誤的url是空而不是ERROR_BAD_URL,排除
* @param webView webView
* @param errorCode errorCode
* @param description description
* @param failingUrl failingUrl
*/
@Override
public void onReceivedError(WebView webView, int errorCode,
String description, String failingUrl) {
super.onReceivedError(webView, errorCode, description, failingUrl);
// -12 == EventHandle.ERROR_BAD_URL, a hide return code inside android.net.http package
if ((failingUrl != null && !failingUrl.equals(webView.getUrl())
&& !failingUrl.equals(webView.getOriginalUrl())) /* not subresource error*/
|| (failingUrl == null && errorCode != -12) /*not bad url*/
|| errorCode == -1) { //當 errorCode = -1 且錯誤信息爲 net::ERR_CACHE_MISS
return;
}
if (!TextUtils.isEmpty(failingUrl)) {
if (failingUrl.equals(webView.getUrl())) {
//作本身的錯誤操做,好比自定義錯誤頁面
}
}
}
/**
* 只有在主頁面加載出現錯誤時,纔會回調這個方法。這正是展現加載錯誤頁面最合適的方法。
* 然而,若是無論三七二十一直接展現錯誤頁面的話,那頗有可能會誤判,給用戶形成常常加載頁面失敗的錯覺。
* 因爲不一樣的WebView實現可能不同,因此咱們首先須要排除幾種誤判的例子:
* 1.加載失敗的url跟WebView裏的url不是同一個url,排除;
* 2.errorCode=-1,代表是ERROR_UNKNOWN的錯誤,爲了保證不誤判,排除
* 3failingUrl=null&errorCode=-12,因爲錯誤的url是空而不是ERROR_BAD_URL,排除
* @param webView webView
* @param webResourceRequest webResourceRequest
* @param webResourceError webResourceError
*/
@Override
public void onReceivedError(WebView webView, WebResourceRequest webResourceRequest,
WebResourceError webResourceError) {
super.onReceivedError(webView, webResourceRequest, webResourceError);
}
/**
* 任何HTTP請求產生的錯誤都會回調這個方法,包括主頁面的html文檔請求,iframe、圖片等資源請求。
* 在這個回調中,因爲混雜了不少請求,不適合用來展現加載錯誤的頁面,而適合作監控報警。
* 當某個URL,或者某個資源收到大量報警時,說明頁面或資源可能存在問題,這時候可讓相關運營及時響應修改。
* @param webView webView
* @param webResourceRequest webResourceRequest
* @param webResourceResponse webResourceResponse
*/
@Override
public void onReceivedHttpError(WebView webView, WebResourceRequest webResourceRequest,
WebResourceResponse webResourceResponse) {
super.onReceivedHttpError(webView, webResourceRequest, webResourceResponse);
}
/**
* 任何HTTPS請求,遇到SSL錯誤時都會回調這個方法。
* 比較正確的作法是讓用戶選擇是否信任這個網站,這時候能夠彈出信任選擇框供用戶選擇(大部分正規瀏覽器是這麼作的)。
* 有時候,針對本身的網站,可讓一些特定的網站,無論其證書是否存在問題,都讓用戶信任它。
* 坑:有時候部分手機打開頁面報錯,絕招:讓本身網站的全部二級域都是可信任的。
* @param webView webView
* @param sslErrorHandler sslErrorHandler
* @param sslError sslError
*/
@Override
public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {
super.onReceivedSslError(webView, sslErrorHandler, sslError);
//判斷網站是不是可信任的,與本身網站host做比較
if (WebViewUtils.isYCHost(webView.getUrl())) {
//若是是本身的網站,則繼續使用SSL證書
sslErrorHandler.proceed();
} else {
super.onReceivedSslError(webView, sslErrorHandler, sslError);
}
}
複製代碼
/**
* 當縮放改變的時候會調用該方法
* @param view view
* @param oldScale 以前的縮放比例
* @param newScale 如今縮放比例
*/
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
//視頻全屏播放按返回頁面被放大的問題
if (newScale - oldScale > 7) {
//異常放大,縮回去。
view.setInitialScale((int) (oldScale / newScale * 100));
}
}
複製代碼
//初始化的時候設置,具體代碼在X5WebView類中
if(Build.VERSION.SDK_INT >= KITKAT) {
//設置網頁在加載的時候暫時不加載圖片
ws.setLoadsImagesAutomatically(true);
} else {
ws.setLoadsImagesAutomatically(false);
}
/**
* 當頁面加載完成會調用該方法
* @param view view
* @param url url連接
*/
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//頁面finish後再發起圖片加載
if(!webView.getSettings().getLoadsImagesAutomatically()) {
webView.getSettings().setLoadsImagesAutomatically(true);
}
}
複製代碼
/**
* 請求網絡出現error
* @param view view
* @param errorCode 錯誤🐎
* @param description description
* @param failingUrl 失敗連接
*/
@Override
public void onReceivedError(WebView view, int errorCode, String description, String
failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
if (errorCode == 404) {
//用javascript隱藏系統定義的404頁面信息
String data = "Page NO FOUND!";
view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\"");
} else {
if (webListener!=null){
webListener.showErrorView();
}
}
}
// 向主機應用程序報告Web資源加載錯誤。這些錯誤一般代表沒法鏈接到服務器。
// 值得注意的是,不一樣的是過期的版本的回調,新的版本將被稱爲任何資源(iframe,圖像等)
// 不只爲主頁。所以,建議在回調過程當中執行最低要求的工做。
// 6.0 以後
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
X5WebUtils.log("服務器異常"+error.getDescription().toString());
}
//ToastUtils.showToast("服務器異常6.0以後");
//當加載錯誤時,就讓它加載本地錯誤網頁文件
//mWebView.loadUrl("file:///android_asset/errorpage/error.html");
if (webListener!=null){
webListener.showErrorView();
}
}
/**
* 這個方法主要是監聽標題變化操做的
* @param view view
* @param title 標題
*/
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (title.contains("404") || title.contains("網頁沒法打開")){
if (webListener!=null){
webListener.showErrorView();
}
} else {
// 設置title
}
}
複製代碼
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
複製代碼
/**
* 在加載資源時通知主機應用程序發生SSL錯誤
* 做用:處理https請求
* @param view view
* @param handler handler
* @param error error
*/
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
if (error!=null){
String url = error.getUrl();
X5WebUtils.log("onReceivedSslError----異常url----"+url);
}
//https忽略證書問題
if (handler!=null){
//表示等待證書響應
handler.proceed();
// handler.cancel(); //表示掛起鏈接,爲默認方式
// handler.handleMessage(null); //可作其餘處理
}
}
複製代碼
@Override
protected void onDestroy() {
try {
//有音頻播放的web頁面的銷燬邏輯
//在關閉了Activity時,若是Webview的音樂或視頻,還在播放。就必須銷燬Webview
//可是注意:webview調用destory時,webview仍綁定在Activity上
//這是因爲自定義webview構建時傳入了該Activity的context對象
//所以須要先從父容器中移除webview,而後再銷燬webview:
if (webView != null) {
ViewGroup parent = (ViewGroup) webView.getParent();
if (parent != null) {
parent.removeView(webView);
}
webView.removeAllViews();
webView.destroy();
webView = null;
}
} catch (Exception e) {
Log.e("X5WebViewActivity", e.getMessage());
}
super.onDestroy();
}
複製代碼
DNS
connection
服務器處理
複製代碼
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
String host = Uri.parse(url).getHost();
LoggerUtils.i("host:" + host);
if (!BuildConfig.IS_DEBUG) {
if (Arrays.binarySearch(domainList, host) < 0) {
//不在白名單內,非法網址,這個時候給用戶強烈而明顯的提示
} else {
//合法網址
}
}
}
複製代碼