美文网首页
android中WebView加载网页出现白屏的问题

android中WebView加载网页出现白屏的问题

作者: IOXusu | 来源:发表于2020-12-28 16:45 被阅读0次

    问题描述:
    使用webview加载Web界面时,会出现界面白屏的情况。http下通常问题不大,通常https白屏的可能性很大,但是通常没有任何报错。

    解决方案:
    1、启用javascript。
    2、使用setDomStorageEnabled方法来支持HTML5中的一些控件标签。【重要】
    3、允许有https和http混合的内容。
    4、跳过页面中的特殊url。
    5、允许证书错误。
    6、允许javascript错误。【重要】

    AndroidManifest.xml中的权限:

    <uses-permission android:name="android.permission.INTERNET" />
    

    别的权限一般情况下不需要。

    上代码:

    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/");
    

    相关文章

      网友评论

          本文标题:android中WebView加载网页出现白屏的问题

          本文链接:https://www.haomeiwen.com/subject/yzktoktx.html