【问题标题】:Error while trying to load a URL in webview - android尝试在 webview 中加载 URL 时出错 - android
【发布时间】:2019-07-14 12:11:08
【问题描述】:

由于 SSL 错误,我正在尝试在我的一个活动中加载 web 视图的 URL 显示为空白。

我已尝试使用网络安全配置 XML 文件夹,但我不确定我是否理解我在做什么。任何帮助将不胜感激。

在调试时,当我将 Google.com 作为 Web 视图中的 URL 加载时,页面加载正常。然后,当我尝试搜索特定站点时,它就在那里,但是当我点击它时,Android Studio 的运行日志中出现 SSL 错误。

public class About_ALC extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_about__alc);
    final WebView webview = (WebView) findViewById(R.id.web_about_alc);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setLoadWithOverviewMode(true);
    webview.getSettings().setUseWideViewPort(true);
    webview.setWebViewClient(new WebViewClient());
    webview.setWebChromeClient(new WebChromeClient());
    webview.loadUrl("https://andela.com/alc/");
}

我在 Android Studio 中收到的错误消息是:

"E/chromium: [ERROR:ssl_client_socket_impl.cc(947)] 握手失败;返回-1,SSL错误代码1,net_error -202"

【问题讨论】:

    标签: ssl android-webview


    【解决方案1】:

    您需要扩展 WebViewClient 以允许加载,尽管出现如下 ssl 错误。

        // A new webclient that ignore ssl errors
        private class IgnoreSSLErrorWebViewClient extends WebViewClient {
            // You can all the class anything
    
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed(); // When an error occurs, ignore and go on
        }
    }
    

    该网站存在 ssl 证书验证问题。出现 ssl 验证错误时,默认 WebViewClient 会停止加载。此扩展程序将指示它忽略错误并继续。

    所以换行webview.setWebViewClient(new WebViewClient());

    webview.setWebViewClient(new IgnoreSSLErrortWebViewClient());

    现在你应该可以正常使用了。

    【讨论】:

    • 成功!!谢谢,我花了很多时间在这上面,我真的很感激!我投了赞成票,但我没有足够的声誉来展示它,但显然它是被记录下来的。谢谢!
    • 对于内联代码格式,单个反引号很好 - 您不需要三元组。
    • 感谢您的编辑。这是我对 SO 的第一个回答,我在正确发布时遇到了一些困难。谢谢指正
    【解决方案2】:

    如果您使用此代码,Play 商店可能会拒绝您的构建

    @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed(); // When an error occurs, ignore and go on
        }
    

    【讨论】:

      【解决方案3】:

      我分享我的方式,没有扩展

      webView = findViewById(R.id.webView);
      webView.getSettings().setJavaScriptEnabled(true);
      webView.setWebViewClient(new WebViewClient(){
         @Override
         public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            //super.onReceivedSslError(view, handler, error);
            handler.proceed();//skip ssl error
         }
      });
      
      webView.loadUrl(URL);
      

      编辑:

      Play 商店可能会将其视为漏洞错误,如果有人需要一些解决方案,请向用户显示错误对话框。这是不自动接受错误,责任是用户,就像那样

      final AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setMessage(msg);
      builder.setPositiveButton("continue", (dialog, which) -> handler.proceed());
      builder.setNegativeButton("cancel", (dialog, which) -> handler.cancel());
      final AlertDialog dialog = builder.create();
      dialog.show();
      

      【讨论】:

        猜你喜欢
        • 2015-12-24
        • 1970-01-01
        • 2016-10-09
        • 1970-01-01
        • 2017-10-17
        • 2014-01-30
        • 2016-04-01
        • 2015-04-14
        • 1970-01-01
        相关资源
        最近更新 更多