Android WebView打開網(wǎng)頁一片空白的解決方法
問題描述:
- 網(wǎng)頁鏈接是Https鏈接
- 網(wǎng)頁鏈接在電腦的Chrome瀏覽器中打開正常
- 網(wǎng)頁鏈接在手機的Chrome瀏覽器中打開正常
- 網(wǎng)頁鏈接在IOS的App上打開正常
- 網(wǎng)頁鏈接在Android App中打開一片空白,沒有任何提示
問題原因
試了很多方法,最后發(fā)現(xiàn)是Https的證書有問題,由于網(wǎng)頁鏈接是客戶提供的,不知道證書是如何生成的,導致不被Android系統(tǒng)信任
問題的發(fā)現(xiàn)之旅
網(wǎng)頁鏈接在手機和電腦都能打開,所以想著網(wǎng)頁鏈接本身應該沒有問題。
debug網(wǎng)頁加載的過程也沒有發(fā)現(xiàn)問題
但是后來用UC瀏覽器打開以后發(fā)現(xiàn)加載的過程中會彈出提示:

出錯的提示
根據(jù)彈出的提示知道很可能是證書的問題,于是重新開始debug項目中的WebView
一般我們在初始化一個 WebView 時都有幾個固定的步驟,其中最重要的一步就是設置 WebViewClient
enWebview.setWebChromeClient(new WebChromeClient()); enWebview.setWebViewClient(new WebViewClient());
如果WebView加載因為證書的問題失敗,就會回調(diào) WebViewClient 的一個接口:
@Override
public void onReceivedSslError(final WebView view, final SslErrorHandler handler, SslError error) {
}
而 WebViewClient 默認會終止加載
public class WebViewClient {
public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {
//終止加載
handler.cancel();
}
...
}
這個 handler 是一個 SslErrorHandler 接口
public class SslErrorHandler extends Handler {
/**
* @hide Only for use by WebViewProvider implementations.
*/
@SystemApi
public SslErrorHandler() {}
/**
* Proceed with the SSL certificate.
*/
public void proceed() {}
/**
* Cancel this request and all pending requests for the WebView that had
* the error.
*/
public void cancel() {}
}
通過上面的注釋我們可以知道,調(diào)用 proceed 就是繼續(xù)利用當前證書加載,而 cancel 就是終止本次的所有請求。而上面 WebViewClient 顯然默認是終止所有請求了。
通過debug發(fā)現(xiàn), WebViewClient 在調(diào)用了上面的 SslErrorHandler 的 cancel 方法以后,就馬上會回調(diào) onPageFinished 方法,不會回調(diào) onReceivedError ,所以也就不會展示自定義的加載錯誤頁面,結果就是一片空白了。
原因找到了,那怎么解決呢?
其實答案也已經(jīng)在上面給出了。我們直接覆寫 WebViewClient 的 onReceivedSslError 方法,然后根據(jù)需要做些處理。比如彈出提示框告訴用戶當前證書有問題,是否繼續(xù)加載等。
public class MyWebViewClient {
public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {
//彈出提示框,讓用戶決定是否繼續(xù)加載
//1.用戶選擇繼續(xù)加載
// handler.proceed();
//2.用戶取消
//handler.cancel()
}
...
}
總結
這個問題困擾了很久,剛剛開始想到可能是WebView兼容問題,因為印象里WebView有很多坑。但是同一個客戶提供的另一個Https的鏈接是正常的,而且之前沒有出現(xiàn)過這種情況,于是debug進去發(fā)現(xiàn)網(wǎng)頁鏈接正常傳入了就沒多想,就認為是沒問題了。還是"too young, too simple"?。?/p>
而且對 WebViewClient 的 onReceivedSslError 也不熟悉,沒有想到這一層?,F(xiàn)如今基本上所有的網(wǎng)頁鏈接都是 Https 的了,我們以后在開發(fā)過程中還是要注意這個問題,在 onReceivedSslError 中提前做好處理。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android開發(fā)筆記之如何正確獲取WebView的網(wǎng)頁Title
- Android WebView實現(xiàn)網(wǎng)頁滾動截圖
- 詳解android 用webview加載網(wǎng)頁(https和http)
- Android開發(fā)中使用WebView控件瀏覽網(wǎng)頁的方法詳解
- Android編程實現(xiàn)webview將網(wǎng)頁打包成apk的方法
- Android中替換WebView加載網(wǎng)頁失敗時的頁面
- Android中Webview打開網(wǎng)頁的同時發(fā)送HTTP頭信息方法
- Android webView如何輸出自定義網(wǎng)頁
相關文章
總結Android App內(nèi)存優(yōu)化之圖片優(yōu)化
網(wǎng)上有很多大拿分享的關于Android性能優(yōu)化的文章,主要是通過各種工具分析,使用合理的技巧優(yōu)化APP的體驗,提升APP的流暢度,但關于內(nèi)存優(yōu)化的文章很少有看到。下面是我在實踐過程中使用的一些方法,很多都是不太成熟的項目,只是將其作為一種處理方式分享給大家。2016-08-08
詳細介紹Android-Room數(shù)據(jù)庫的使用
這篇文章主要介紹了詳細介紹Android-Room數(shù)據(jù)庫的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
Android開發(fā)筆記之:返回鍵的復寫onBackPressed()介紹
本篇文章是對Android中返回鍵的復寫onBackPressed()進行了詳細的分析介紹,需要的朋友參考下2013-05-05
Android利用ViewPager實現(xiàn)滑動廣告板實例源碼
利用ViewPager我們可以做很多事情,從最簡單的導航,到頁面切換菜單等等。ViewPager的功能就是可以使視圖滑動,就像Lanucher左右滑動那樣2013-06-06

