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
相关产品推荐
相关产品推荐

