如何适配 Android 9.0? 在 Android 9.0 上发生 SSL handshake timed out 异常怎么解决

如何适配 Android 9.0? 在 Android 9.0 上发生下面的异常怎么解决? 报错信息如下: java.net.SocketTimeoutException: SSL handshake timed out
发布时间: 2019-03-04 16:17

回答:

Android 9.0 开始,默认不允许明文传输,所以在建立网络连接时会使用 https 连接,同时进行安全认证。如果应用没有做对应处理,即会发生上述异常。

解决方法有两种:

一. 在应用里声明允许明文传输. 

    1. 在应用的 res/xml 文件夹下新建 network_security_config.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>


  2. 在 AndroidManifest.xml 的 application 节点下,配置允许明文传输的属性。

image.png

通过上述配置后,在 Android 9.0 手机上会仍然使用 http 连接,即明文传输的方式。

二. 不使用明文传输,使用 https 方式。

     如果在应用里没有声明允许明文传输,那么 SDK 默认在 Android 9.0 系统上会使用 https 连接方式,也就意味着会进行安全认证。

     如果您是公有云用户,则不需要处理,融云服务已经配置了安全证书。

     如果您是私有云客户,且使用自签证书的话,需要调用下面的 API , 参数传 true:

/**
 * 设置建立 Https 连接时,是否使用自签证书。
 * <p> 此方法需要在 {@link #init(Context)}之前调用。</p>
 * <p> 如果不调用此方法, SDK 连接时会按默认证书处理</p>
 *
 * @param isEnable 是否使用自签证书。true 使用自签证书;false, 使用默认证书。
 */
public void enableHttpsSelfCertificate(final boolean isEnable)