Boss告诉我我们要访问Https的网址,但是我们没有安全证书,因为客户不想要买域名,不想花那个钱。
开始访问:给我的服务器地址是这样的:https://192.168.3.19/view/video/video_p.html
先说一下我们最后的解决方案:
1.地址改为:https://192.168.3.19:443/view/video/video_p.html
下面我们讲一下历程2.mWebView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } });mWebView.loadUrl("https://192.168.3.19/view/video/video_p.html");很自然的出错没商量,我们没有证书嘛!所以百度一下,要这样写:mWebView.setWebViewClient(new WebViewClient(){ @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); } });这样ssl加载出错的话会回调这个方法,嗯,理论上确实是这样!但是实际上,却给我返回了这样一个错误:ERR_SSL_PROTOCOL_ERROR并且没有回调onReceivedSslError方法然后又是一通百度,说是在5.0(api21)之后需要加这么一句话:settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);试了之后没用!继续,StackOverFlow上说还要加这么两句:settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true);然并卵,这可咋整,所有的解决方法差不多都试了,没办法了,去看一下https吧,结果我就发现他的端口和http不一样,不是80,而是443!坑爹啊,换了之后就好了。当然,如果你的项目需要上线的话,那么步骤二建议这么写:将下面代码复制到onReceivedSslError里,注意一定要将onReceivedSslError方法里本来的super.onReceivedSslError删除掉AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.webView.getContext()); AlertDialog alertDialog = builder.create(); String message = "Certificate error."; switch (error.getPrimaryError()) { case SslError.SSL_UNTRUSTED: message = "The certificate authority is not trusted."; break; case SslError.SSL_EXPIRED: message = "The certificate has expired."; break; case SslError.SSL_IDMISMATCH: message = "The certificate Hostname mismatch."; break; case SslError.SSL_NOTYETVALID: message = "The certificate is not yet valid."; break; } message += " Do you want to continue anyway?"; alertDialog.setTitle("SSL Certificate Error"); alertDialog.setMessage(message); alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.d("CHECK", "Button ok pressed"); // Ignore SSL certificate errors handler.proceed(); } }); alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.d("CHECK", "Button cancel pressed"); handler.cancel(); } }); alertDialog.show();