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

出錯(cuò)的提示
根據(jù)彈出的提示知道很可能是證書(shū)的問(wèn)題,于是重新開(kāi)始debug項(xiàng)目中的WebView
一般我們?cè)诔跏蓟粋€(gè) WebView 時(shí)都有幾個(gè)固定的步驟,其中最重要的一步就是設(shè)置 WebViewClient
enWebview.setWebChromeClient(new WebChromeClient()); enWebview.setWebViewClient(new WebViewClient());
如果WebView加載因?yàn)樽C書(shū)的問(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)前證書(shū)加載,而 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)在上面給出了。我們直接覆寫(xiě) WebViewClient 的 onReceivedSslError 方法,然后根據(jù)需要做些處理。比如彈出提示框告訴用戶當(dāng)前證書(shū)有問(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)題困擾了很久,剛剛開(kāi)始想到可能是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)有想到這一層?,F(xiàn)如今基本上所有的網(wǎng)頁(yè)鏈接都是 Https 的了,我們以后在開(kāi)發(fā)過(guò)程中還是要注意這個(gè)問(wèn)題,在 onReceivedSslError 中提前做好處理。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android開(kāi)發(fā)筆記之如何正確獲取WebView的網(wǎng)頁(yè)Title
- Android WebView實(shí)現(xiàn)網(wǎng)頁(yè)滾動(dòng)截圖
- 詳解android 用webview加載網(wǎng)頁(yè)(https和http)
- Android開(kāi)發(fā)中使用WebView控件瀏覽網(wǎng)頁(yè)的方法詳解
- Android編程實(shí)現(xiàn)webview將網(wǎng)頁(yè)打包成apk的方法
- Android中替換WebView加載網(wǎng)頁(yè)失敗時(shí)的頁(yè)面
- Android中Webview打開(kāi)網(wǎng)頁(yè)的同時(shí)發(fā)送HTTP頭信息方法
- Android webView如何輸出自定義網(wǎng)頁(yè)
相關(guān)文章
總結(jié)Android App內(nèi)存優(yōu)化之圖片優(yōu)化
網(wǎng)上有很多大拿分享的關(guān)于Android性能優(yōu)化的文章,主要是通過(guò)各種工具分析,使用合理的技巧優(yōu)化APP的體驗(yàn),提升APP的流暢度,但關(guān)于內(nèi)存優(yōu)化的文章很少有看到。下面是我在實(shí)踐過(guò)程中使用的一些方法,很多都是不太成熟的項(xiàng)目,只是將其作為一種處理方式分享給大家。2016-08-08
詳細(xì)介紹Android-Room數(shù)據(jù)庫(kù)的使用
這篇文章主要介紹了詳細(xì)介紹Android-Room數(shù)據(jù)庫(kù)的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Android開(kāi)發(fā)筆記之:返回鍵的復(fù)寫(xiě)onBackPressed()介紹
本篇文章是對(duì)Android中返回鍵的復(fù)寫(xiě)onBackPressed()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Android開(kāi)發(fā)之RecyclerView控件
本文給大家介紹的是Android開(kāi)發(fā)中常用的RecyclerView控件的使用方法以及簡(jiǎn)單的特性,有需要的小伙伴可以參考下2016-02-02
Flutter使用?input?chip?標(biāo)簽組件示例詳解
這篇文章主要為大家介紹了Flutter使用?input?chip?標(biāo)簽組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android利用ViewPager實(shí)現(xiàn)滑動(dòng)廣告板實(shí)例源碼
利用ViewPager我們可以做很多事情,從最簡(jiǎn)單的導(dǎo)航,到頁(yè)面切換菜單等等。ViewPager的功能就是可以使視圖滑動(dòng),就像Lanucher左右滑動(dòng)那樣2013-06-06

