Android WebView打開網(wǎng)頁(yè)一片空白的解決方法
問(wèn)題描述:
- 網(wǎng)頁(yè)鏈接是Https鏈接
- 網(wǎng)頁(yè)鏈接在電腦的Chrome瀏覽器中打開正常
- 網(wǎng)頁(yè)鏈接在手機(jī)的Chrome瀏覽器中打開正常
- 網(wǎng)頁(yè)鏈接在IOS的App上打開正常
- 網(wǎng)頁(yè)鏈接在Android App中打開一片空白,沒(méi)有任何提示
問(wèn)題原因
試了很多方法,最后發(fā)現(xiàn)是Https的證書有問(wèn)題,由于網(wǎng)頁(yè)鏈接是客戶提供的,不知道證書是如何生成的,導(dǎo)致不被Android系統(tǒng)信任
問(wèn)題的發(fā)現(xiàn)之旅
網(wǎng)頁(yè)鏈接在手機(jī)和電腦都能打開,所以想著網(wǎng)頁(yè)鏈接本身應(yīng)該沒(méi)有問(wèn)題。
debug網(wǎng)頁(yè)加載的過(guò)程也沒(méi)有發(fā)現(xiàn)問(wèn)題
但是后來(lái)用UC瀏覽器打開以后發(fā)現(xiàn)加載的過(guò)程中會(huì)彈出提示:
出錯(cuò)的提示
根據(jù)彈出的提示知道很可能是證書的問(wèn)題,于是重新開始debug項(xiàng)目中的WebView
一般我們?cè)诔跏蓟粋€(gè) WebView
時(shí)都有幾個(gè)固定的步驟,其中最重要的一步就是設(shè)置 WebViewClient
enWebview.setWebChromeClient(new WebChromeClient()); enWebview.setWebViewClient(new WebViewClient());
如果WebView加載因?yàn)樽C書的問(wèn)題失敗,就會(huì)回調(diào) WebViewClient
的一個(gè)接口:
@Override public void onReceivedSslError(final WebView view, final SslErrorHandler handler, SslError error) { }
而 WebViewClient
默認(rèn)會(huì)終止加載
public class WebViewClient { public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) { //終止加載 handler.cancel(); } ... }
這個(gè) handler
是一個(gè) 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() {} }
通過(guò)上面的注釋我們可以知道,調(diào)用 proceed
就是繼續(xù)利用當(dāng)前證書加載,而 cancel
就是終止本次的所有請(qǐng)求。而上面 WebViewClient
顯然默認(rèn)是終止所有請(qǐng)求了。
通過(guò)debug發(fā)現(xiàn), WebViewClient
在調(diào)用了上面的 SslErrorHandler
的 cancel
方法以后,就馬上會(huì)回調(diào) onPageFinished
方法,不會(huì)回調(diào) onReceivedError
,所以也就不會(huì)展示自定義的加載錯(cuò)誤頁(yè)面,結(jié)果就是一片空白了。
原因找到了,那怎么解決呢?
其實(shí)答案也已經(jīng)在上面給出了。我們直接覆寫 WebViewClient
的 onReceivedSslError
方法,然后根據(jù)需要做些處理。比如彈出提示框告訴用戶當(dāng)前證書有問(wèn)題,是否繼續(xù)加載等。
public class MyWebViewClient { public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) { //彈出提示框,讓用戶決定是否繼續(xù)加載 //1.用戶選擇繼續(xù)加載 // handler.proceed(); //2.用戶取消 //handler.cancel() } ... }
總結(jié)
這個(gè)問(wèn)題困擾了很久,剛剛開始想到可能是WebView兼容問(wèn)題,因?yàn)橛∠罄颳ebView有很多坑。但是同一個(gè)客戶提供的另一個(gè)Https的鏈接是正常的,而且之前沒(méi)有出現(xiàn)過(guò)這種情況,于是debug進(jìn)去發(fā)現(xiàn)網(wǎng)頁(yè)鏈接正常傳入了就沒(méi)多想,就認(rèn)為是沒(méi)問(wèn)題了。還是"too young, too simple"??!
而且對(duì) WebViewClient
的 onReceivedSslError
也不熟悉,沒(méi)有想到這一層。現(xiàn)如今基本上所有的網(wǎng)頁(yè)鏈接都是 Https
的了,我們以后在開發(fā)過(guò)程中還是要注意這個(gè)問(wèn)題,在 onReceivedSslError
中提前做好處理。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android開發(fā)筆記之如何正確獲取WebView的網(wǎng)頁(yè)Title
- Android WebView實(shí)現(xiàn)網(wǎng)頁(yè)滾動(dòng)截圖
- 詳解android 用webview加載網(wǎng)頁(yè)(https和http)
- Android開發(fā)中使用WebView控件瀏覽網(wǎng)頁(yè)的方法詳解
- Android編程實(shí)現(xiàn)webview將網(wǎng)頁(yè)打包成apk的方法
- Android中替換WebView加載網(wǎng)頁(yè)失敗時(shí)的頁(yè)面
- Android中Webview打開網(wǎng)頁(yè)的同時(shí)發(fā)送HTTP頭信息方法
- Android webView如何輸出自定義網(wǎng)頁(yè)
相關(guān)文章
android中view手勢(shì)滑動(dòng)沖突的解決方法
本篇文章主要介紹了android中view手勢(shì)滑動(dòng)沖突的解決方法,主要解決方法有兩種,外部和內(nèi)部攔截。有需要的可以參考下。2016-11-11詳解Android Activity中的幾種監(jiān)聽器和實(shí)現(xiàn)方式
這篇文章主要介紹了Activity中的幾種監(jiān)聽器和實(shí)現(xiàn)方式的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04Android利用Fragment實(shí)現(xiàn)Tab選項(xiàng)卡效果
這篇文章主要為大家詳細(xì)介紹了Android利用Fragment實(shí)現(xiàn)Tab選項(xiàng)卡效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Android開發(fā)實(shí)現(xiàn)NFC刷卡讀取的兩種方式
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)中實(shí)現(xiàn)NFC刷卡讀取的兩種方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Android編程中沉浸式狀態(tài)欄的三種實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Android編程中沉浸式狀態(tài)欄的三種實(shí)現(xiàn)方式,簡(jiǎn)單描述了沉浸式狀態(tài)欄的概念、功能并結(jié)合實(shí)例形式詳細(xì)分析了Android實(shí)現(xiàn)沉浸式狀態(tài)欄的三種操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-02-02Android高仿QQ6.0側(cè)滑刪除實(shí)例代碼
先給大家分享一下,側(cè)滑刪除,布局也就是前面一個(gè)item,然后有兩個(gè)隱藏的按鈕(TextView也可以),然后我們可以向左側(cè)滑動(dòng),然后顯示出來(lái),然后對(duì)delete(刪除鍵)實(shí)現(xiàn)監(jiān)聽,就可以了哈。好了那就來(lái)看看代碼怎么實(shí)現(xiàn)的吧2016-02-02使用newInstance()來(lái)實(shí)例化fragment并傳遞數(shù)據(jù)操作
這篇文章主要介紹了使用newInstance()來(lái)實(shí)例化fragment并傳遞數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08Android實(shí)現(xiàn)簡(jiǎn)單底部導(dǎo)航欄 Android仿微信滑動(dòng)切換效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單底部導(dǎo)航欄,Android仿微信滑動(dòng)切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08