在Android5.0及以上系統,當WebView加載的鏈接爲https開頭,但是鏈接裏面的內容,比如圖片爲http鏈接,這時候,圖片就不能正常加載(加載不出來)。
由於自己在項目中踩坑遇到此問題,也是各種查閱嘗試,最終得以解決,特此記錄下:
在Android5.0中,WebView方面做了些修改,如果你的系統target api爲21以上:
- 系統默認禁止了mixed content和第三方cookie。可以使用setMixedContentMode() 和 setAcceptThirdPartyCookies()以分別啓用。
- 系統現在可以智能選擇HTML文檔的portion來繪製。這種新特性可以減少內存footprint並改進性能。若要一次性渲染整個HTML文檔,可以調用這個方法enableSlowWholeDocumentDraw()
- 如果你的app的target api低於21:系統允許mixed content和第三方cookie,並且總是一次性渲染整個HTML文檔。
一、WebView鏈接爲https,內容圖片爲http,圖片不能正常顯示,原因主要是:
webview 從Lollipop(5.0)開始 webview默認不允許混合模式,https當中不能加載http資源,如果要加載,需單獨設置開啓,
二、解決方案:
1.在加載錢先阻塞圖片加載:
setting.setBlockNetworkImage(true);
(在webview加載頁面之前,設置加載模式爲MIXED_CONTENT_ALWAYS_ALLOW)
// 允許從任何來源加載內容,即使起源是不安全的
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
2.在WebView 渲染完成後,解除阻塞,加載圖片
webView.setWebViewClient(new WebViewClient() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String s = request.getUrl().toString();
view.loadUrl(s);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
progressBar.setVisibility(View.GONE);
Log.i(TAG, "onPageFinished-->" + url);
settings.setBlockNetworkImage(false);//解除阻塞
//判斷webview是否加載了,圖片資源
if (!settings.getLoadsImagesAutomatically()) {
settings.setLoadsImagesAutomatically(true); //設置wenView加載圖片資源
}
super.onPageFinished(view, url);
}
});
}
更多參考鏈接:Android官網解釋鏈接
三、相關問題拓展