網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Android webview加載https鏈接錯(cuò)誤或無(wú)響應(yīng)的解決
?
最近做無(wú)線(xiàn)WiFi的時(shí)候,在最后認(rèn)證成功的時(shí)候會(huì)彈出一個(gè)廣告頁(yè),于是用webview去加載了一下,結(jié)果沒(méi)反應(yīng),打印url出來(lái)看了一下,發(fā)現(xiàn)是https格式的,在使用WebView加載https資源文件時(shí),如果認(rèn)證證書(shū)不被Android認(rèn)可,那么會(huì)出現(xiàn)無(wú)法成功加載對(duì)應(yīng)資源問(wèn)題。那么,我們就要針對(duì)這一狀況作出對(duì)應(yīng)的處理。
于是百度了一下,這里記錄一下,給大家做個(gè)參考:
1、設(shè)置WebView接受所有網(wǎng)站的證書(shū)
在認(rèn)證證書(shū)不被Android所接受的情況下,我們可以通過(guò)設(shè)置重寫(xiě)WebViewClient的onReceivedSslError方法在其中設(shè)置接受所有網(wǎng)站的證書(shū)來(lái)解決,重寫(xiě)WebView的onReceivedSslError方法,添加handler.proceed方法,但App如果上架GooglePlay會(huì)被警告的。所以建議使用以下的第二個(gè)方法。
具體代碼如下:
webView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){ handler.proceed(); } });
注:在重寫(xiě)WebViewClient的onReceivedSslError方法時(shí),注意一定要去除onReceivedSslError方法的super.onReceivedSslError(view, handler, error);,否則設(shè)置無(wú)效。
2、啟用mixed content
Android webView 從 Lollipop 開(kāi)始默認(rèn)不開(kāi)MixedContentMode,因此,我們開(kāi)啟即可滿(mǎn)足我們大多數(shù)需求。
webView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.getSettings() .setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } });
在Android5.0中,WebView方面做了些修改,如果你的系統(tǒng)target api為21以上:
系統(tǒng)默認(rèn)禁止了mixed content和第三方cookie。可以使用setMixedContentMode() 和 setAcceptThirdPartyCookies()以分別啟用。
系統(tǒng)現(xiàn)在可以智能選擇HTML文檔的portion來(lái)繪制。這種新特性可以減少內(nèi)存footprint并改進(jìn)性能。若要一次性渲染整個(gè)HTML文檔,可以調(diào)用這個(gè)方法enableSlowWholeDocumentDraw(),如果你的app的target api低于21:系統(tǒng)允許mixed content和第三方cookie,并且總是一次性渲染整個(gè)HTML文檔。
在使用WebView的類(lèi)中添加如下代碼:
// android 5.0以上默認(rèn)不支持Mixed Content if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.getSettings().setMixedContentMode( WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); }
結(jié)果:
我的問(wèn)題并不是出現(xiàn)在這些地方,而是出現(xiàn)了在加載Url時(shí),部分Url使用的事http而不是https,導(dǎo)致無(wú)法加載,功能實(shí)現(xiàn)不了。那么要求后臺(tái)開(kāi)發(fā)人員把http改成https。就這樣,成功了。或者還可以使用一些第三方庫(kù)來(lái)加載也行。
測(cè)試:
1、調(diào)用高德地圖沒(méi)法顯示,前端工程師用了http……那么改為https
2、部分功能沒(méi)實(shí)現(xiàn),因?yàn)楹笈_(tái)的沒(méi)有加證書(shū)…..那么,全部改回http
補(bǔ)充知識(shí):Android WebView加載網(wǎng)頁(yè)鏈接遇到的那些坑
本來(lái)覺(jué)得十分簡(jiǎn)單的問(wèn)題,結(jié)果遇到了不少坑,到現(xiàn)在都不敢保證不出問(wèn)題,只是解決了大部分問(wèn)題。。。
下面是列出幾個(gè)問(wèn)題
在webview中跳轉(zhuǎn)別的頁(yè)面無(wú)響應(yīng)
在webview中下載文件無(wú)響應(yīng)
部分網(wǎng)址鏈接無(wú)法顯示
部分網(wǎng)址打開(kāi)自動(dòng)跳轉(zhuǎn)到瀏覽器
1.在webview中跳轉(zhuǎn)別的頁(yè)面無(wú)響應(yīng)
修改之前代碼如下:
WebSettings webSettings = webView.getSettings(); //設(shè)置WebView屬性,能夠執(zhí)行Javascript腳本 webSettings.setJavaScriptEnabled(true); //設(shè)置可以訪(fǎng)問(wèn)文件 webSettings.setAllowFileAccess(true); //設(shè)置支持縮放 webSettings.setBuiltInZoomControls(true); webView.loadUrl(link); webView.setWebViewClient(new webViewClient ());
修改之后加了不少webview的設(shè)置包括:
webSettings.setAppCacheEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.supportMultipleWindows(); webSettings.setAllowContentAccess(true); webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setSavePassword(true); webSettings.setSaveFormData(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setLoadsImagesAutomatically(true); webView.setWebChromeClient(new WebChromeClient());//這行最好不要丟掉
當(dāng)然,這些屬性可能有些不是必須要添加的,為了盡量滿(mǎn)足多種需求,所以我都添加了。
修改完成后就可以在webview中跳轉(zhuǎn)別的url鏈接了,就算是解決了第一個(gè)問(wèn)題吧。
2.在webview中下載文件無(wú)響應(yīng)
因?yàn)楸旧韜ebview不具備下載功能,所以需要讓系統(tǒng)處理或者自定義下載。
webview給我們提供了一個(gè)下載監(jiān)聽(tīng)接口,下面我們來(lái)實(shí)現(xiàn)下載處理:
class MyDownLoad implements DownloadListener { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { if (url.endsWith(".apk")) { /** * 通過(guò)系統(tǒng)下載apk */ Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); } } }
然后再設(shè)置中添加:
webView.setDownloadListener(new MyDownLoad());
這里是將下載功能交給系統(tǒng)來(lái)處理了,并沒(méi)有特殊需求所以就不自定義了。
3.部分網(wǎng)址鏈接無(wú)法顯示,報(bào)錯(cuò)net::err_unknown_url_scheme
由于我們有時(shí)候自定義了WebViewClient,內(nèi)容大致如下:
private class webViewClient extends WebViewClient { public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadurl(url)//返回true代表在當(dāng)前webview中打開(kāi),返回false表示打開(kāi)瀏覽器 return super.shouldOverrideUrlLoading(view,url); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if(!dialog.isShowing()) { dialog.show(); } super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { if(dialog.isShowing()){ dialog.dismiss(); } super.onPageFinished(view, url); } }
注意shouldOverrideUrlLoading方法,平時(shí)我們可能會(huì)在其中設(shè)置view.loadurl(url),正是這句代碼導(dǎo)致部分網(wǎng)頁(yè)打不開(kāi),這可能是webview的本身加載網(wǎng)頁(yè)有限制吧。所以我把這句去掉了,在返回時(shí)返回了true(true表示在當(dāng)前webview中打開(kāi)網(wǎng)頁(yè),false則更傾向于瀏覽器打開(kāi)網(wǎng)頁(yè))。這樣做,發(fā)現(xiàn)部分網(wǎng)頁(yè)仍然打不開(kāi)。于是直接刪掉了webView.setWebViewClient(new webViewClient ()),而webView.setWebChromeClient(new WebChromeClient())不能刪,結(jié)果網(wǎng)頁(yè)是打開(kāi)了,但有的則自動(dòng)跳轉(zhuǎn)到瀏覽器打開(kāi)的。但我們的需求是不要打開(kāi)瀏覽器。。。
4.部分網(wǎng)址打開(kāi)自動(dòng)跳轉(zhuǎn)到瀏覽器
接到上面所講,打開(kāi)部分網(wǎng)址跳轉(zhuǎn)到瀏覽器了,如何不讓他跳轉(zhuǎn)呢,返回true可以禁止跳轉(zhuǎn),但部分網(wǎng)址在webview中無(wú)法打開(kāi),接下來(lái),不給它直接返回true或false了,而是返回super,讓它父類(lèi)處理,結(jié)果也并沒(méi)有調(diào)到瀏覽器并且網(wǎng)頁(yè)也打開(kāi)了,現(xiàn)在暫時(shí)就這樣結(jié)尾了做到了大部分網(wǎng)址的兼容。
總結(jié):本人對(duì)webview了解也是有限,所以并不深入只是解決部分問(wèn)題,可能理解也有偏差,如有問(wèn)題請(qǐng)見(jiàn)諒。希望能給大家一個(gè)參考,也希望大家多多支持悠悠之家。
原文鏈接:https://blog.csdn.net/nnmmbb/article/details/129989505
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-09-16 selenium.chrome寫(xiě)擴(kuò)展攔截或轉(zhuǎn)發(fā)請(qǐng)求功能_C#教程
- 2022-04-17 axios 并發(fā)請(qǐng)求時(shí),刷新token的處理方法
- 2022-07-06 Nginx的mirror指令示例配置_nginx
- 2022-05-11 并發(fā)編程之JMM模型和并發(fā)三大特性
- 2022-03-26 Android實(shí)現(xiàn)調(diào)用攝像頭拍照并存儲(chǔ)照片_Android
- 2022-06-02 OnZoom基于Apache?Hudi的一體架構(gòu)實(shí)踐解析_服務(wù)器其它
- 2022-05-10 FactoryBean配置文件定義的 類(lèi)型 調(diào)用時(shí)返回 不同的類(lèi)型
- 2022-07-26 SpringMVC的流程
- 欄目分類(lèi)
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支