問題描述:
使用webview加載Web界面時,會出現(xiàn)界面白屏的情況衙傀。http下通常問題不大抬吟,通常https白屏的可能性很大,但是通常沒有任何報錯统抬。
解決方案:
1火本、啟用javascript。
2聪建、使用setDomStorageEnabled方法來支持HTML5中的一些控件標簽钙畔。【重要】
3金麸、允許有https和http混合的內(nèi)容擎析。
4、跳過頁面中的特殊url挥下。
5揍魂、允許證書錯誤。
6棚瘟、允許javascript錯誤现斋。【重要】
AndroidManifest.xml中的權(quán)限:
<uses-permission android:name="android.permission.INTERNET" />
別的權(quán)限一般情況下不需要解取。
上代碼:
WebView webview = findViewById(R.id.viewWeb);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true); // 啟用javascript
settings.setDomStorageEnabled(true); // 支持HTML5中的一些控件標簽
settings.setBuiltInZoomControls(false); // 自選步责,非必要
//處理http和https混合的問題
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
} else {
settings.setMixedContentMode(WebSettings.LOAD_NORMAL);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// 允許javascript出錯
try {
Method method = Class.forName("android.webkit.WebView").
getMethod("setWebContentsDebuggingEnabled", Boolean.TYPE);
if (method != null) {
method.setAccessible(true);
method.invoke(null, true);
}
} catch (Exception e) {
// do nothing
}
}
webview.setFocusable(true); // 自選,非必要
webview.setDrawingCacheEnabled(true); // 自選,非必要
webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); // 自選蔓肯,非必要
webview.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int progress) { // 顯示加載進度遂鹊,自選
TextView txtProgress = findViewById(R.id.txtProgress);
txtProgress.setText(String.format(Locale.CHINA, "%d%%", progress));
txtProgress.setVisibility((progress > 0 && progress < 100) ? View.VISIBLE : View.GONE);
}
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false); // 頁面有請求位置的時候需要
}
});
webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("http://") || url.startsWith("https://")) { // 4.0以上必須要加
view.loadUrl(url);
return true;
}
return false;
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
//super.onReceivedSslError(view, handler, error)
switch (error.getPrimaryError()) {
case SslError.SSL_INVALID: // 校驗過程遇到了bug
case SslError.SSL_UNTRUSTED: // 證書有問題
handler.proceed();
default:
handler.cancel();
}
}
});
webview.loadUrl("https://ifyr.pw/");