You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13+设备Retrofit API请求失败,Android12及以下正常如何修复?

修复Android 13+上Retrofit请求失败的问题

针对你的问题,以下是具体的排查和修复方案:

1. 确认网络权限配置

Android 13+对网络权限的核心要求未变,但需确保AndroidManifest.xml中声明了必要权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

若应用需在后台发起网络请求,需额外添加Android 12+引入的后台网络权限,并在代码中动态申请:

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_NETWORK" />

2. 升级Retrofit与OkHttp依赖

当前使用的Retrofit(2.9.0)和OkHttp(4.9.1)版本较旧,存在与Android 13+系统的兼容性风险。更新至最新稳定版:

// Retrofit核心与Gson转换器
implementation ("com.squareup.retrofit2:retrofit:2.11.0")
implementation ("com.squareup.retrofit2:converter-gson:2.11.0")
// OkHttp核心库
implementation ("com.squareup.okhttp3:okhttp:4.12.0")
// 可选:添加日志拦截器用于调试
implementation ("com.squareup.okhttp3:logging-interceptor:4.12.0")

3. 配置OkHttp兼容现代TLS版本

Android 13+默认强化了TLS安全性,若服务器使用较低版本TLS(如1.0/1.1),需配置OkHttp启用兼容模式:

// 构建支持兼容TLS的OkHttp客户端
val okHttpClient = OkHttpClient.Builder()
    .connectionSpecs(listOf(
        ConnectionSpec.MODERN_TLS,
        ConnectionSpec.COMPATIBLE_TLS
    ))
    .build()

// 关联到Retrofit实例
val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

若服务器证书存在问题(仅测试环境使用),可添加自定义信任管理器跳过验证(生产环境禁止):

class TrustAllCerts : X509TrustManager {
    override fun checkClientTrusted(chain: Array<X509Certificate>?, authType: String?) {}
    override fun checkServerTrusted(chain: Array<X509Certificate>?, authType: String?) {}
    override fun getAcceptedIssuers(): Array<X509Certificate> = emptyArray()
}

// 在OkHttp配置中添加
.sslSocketFactory(
    SSLContext.getInstance("TLSv1.2").apply { init(null, arrayOf(TrustAllCerts()), SecureRandom()) }.socketFactory,
    TrustAllCerts()
)

4. 启用日志拦截器定位错误原因

添加OkHttp日志拦截器,查看请求的详细错误日志,精准定位失败原因:

val loggingInterceptor = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY
}

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(loggingInterceptor)
    // 其他配置
    .build()

运行后查看Logcat,重点关注onFailure回调中Throwable的具体信息(如SSL握手失败、连接超时、权限拒绝等)。

5. 配置明文流量(若使用HTTP接口)

若API为HTTP协议,需在AndroidManifest.xml的<application>标签中开启明文流量:

android:usesCleartextTraffic="true"

同时创建res/xml/network_security_config.xml文件:

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

并在AndroidManifest.xml中关联该配置:

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">

6. 处理后台网络限制

若请求在应用后台发起,Android 12+限制了后台网络访问,可通过以下方式解决:

  • 确保请求在应用前台时发起
  • 动态申请ACCESS_BACKGROUND_NETWORK权限
  • 使用WorkManager等组件处理后台网络任务

内容的提问来源于stack exchange,提问作者Dev Panwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:09:51