You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OkHttp Response仅在Android 4.4上为空问题求助

解决Android 4.4上OkHttp3请求SSL API失败的问题

这种情况我之前帮朋友排查过类似的,Android 4.4的SSL/TLS支持逻辑和高版本系统有明显差异,这大概率是导致你所有请求失败的核心原因,给你几个具体的排查和解决方向:

1. 强制启用TLS 1.2支持

Android 4.4(API 19)默认没有开启TLS 1.2支持,但现在绝大多数HTTPS API服务器已经禁用了老旧的SSLv3、TLS 1.0协议,只支持TLS 1.2及以上版本。你需要给OkHttp配置强制启用TLS 1.2:

ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
        .tlsVersions(TlsVersion.TLS_1_2)
        .build();

OkHttpClient client = new OkHttpClient.Builder()
        .connectionSpecs(Collections.singletonList(spec))
        // 保留你的其他配置:认证头、拦截器等
        .build();

如果服务器还兼容TLS 1.0,也可以把TlsVersion.TLS_1_0加进去,但优先推荐只保留TLS 1.2保障安全性。

2. 确认OkHttp版本兼容性

OkHttp从4.x版本开始就不再支持Android 4.4了,如果你用的是OkHttp 4.x及以上版本,直接降级到3.12.x系列(这是最后支持Android 4.4的稳定版本),在build.gradle里配置:

implementation 'com.squareup.okhttp3:okhttp:3.12.13'
// 对应的OkLogInterceptor也要匹配3.x版本:
implementation 'com.github.simonpercic:oklog3:3.0.0'

3. 排查证书信任问题

Android 4.4的系统信任证书库比较旧,如果你的API服务器使用的是较新的根证书(比如Let's Encrypt的部分证书),系统可能不认可,导致握手失败。可以尝试两种方式:

  • 把服务器的证书打包到应用中,自定义信任管理器让OkHttp信任该证书(生产环境推荐);
  • 临时测试时可以使用不验证证书的配置(注意:生产环境绝对不能这么做,会有严重安全风险):
TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {}
        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) {}
        @Override
        public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
    }
};

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new SecureRandom());

OkHttpClient client = new OkHttpClient.Builder()
        .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
        .hostnameVerifier((hostname, session) -> true)
        // 其他配置
        .build();

4. 补充更详细的调试日志

OkLogInterceptor可能在低版本系统下无法输出完整的错误信息,建议加上OkHttp官方的HttpLoggingInterceptor,设置到BODY级别,查看握手阶段的具体错误:

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(loggingInterceptor)
        .addInterceptor(new OkLogInterceptor()) // 保留原有拦截器
        // 其他配置
        .build();

这样你就能看到请求发送前的配置、握手过程中的错误(比如协议不兼容、证书验证失败等),更精准定位问题。

内容的提问来源于stack exchange,提问作者Enrico Deleo

火山引擎 最新活动