最近公司项目迁移了服务器,同样的也由http变成了https协议。不过调试的时候发现4.x的设备都无法进行访问网络了,5.0及以上的设备没有遇到问题。百度许久未果,在谷歌爸爸上找到了答案。 原文地址:https://github.com/square/okhttp/issues/2372
解决方法如下:
1.添加以下内容的Tls12SocketFactory.java类
2.在代码中添加下面的方法
public static OkHttpClient.Builder enableTls12OnPreLollipop(OkHttpClient.Builder client) { if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) { try { SSLContext sc = SSLContext.getInstance("TLSv1.2"); sc.init(null, null, null); client.sslSocketFactory(new Tls12SocketFactory(sc.getSocketFactory())); ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) .tlsVersions(TlsVersion.TLS_1_2) .build(); List<ConnectionSpec> specs = new ArrayList<>(); specs.add(cs); specs.add(ConnectionSpec.COMPATIBLE_TLS); specs.add(ConnectionSpec.CLEARTEXT); client.connectionSpecs(specs); } catch (Exception exc) { Log.e("OkHttpTLSCompat", "Error while setting TLS 1.2", exc); } } return client;}3.最后在实例化okhttp客户端的时候,作类似如下的处理
private OkHttpClient getNewHttpClient() { OkHttpClient.Builder client = new OkHttpClient.Builder() .followRedirects(true) .followSslRedirects(true) .retryOnConnectionFailure(true) .cache(null) .connectTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS); return enableTls12OnPreLollipop(client).build();}采用了上面的方法后,4.x的设备也可以正常的进行网络访问了,不过又遇到了新的坑。在4.x下,第三方的图片加载框架,无论是glide还是imageloader,都无法正常加载。看来这是网站配置证书的问题,毕竟用的是免费证书,遇到问题也不足为怪了。
新闻热点
疑难解答