如何让Volley库在Android API 26及更高版本正常运行
Volley在API26+版本适配方案
问题核心
应用仅在API26(Android 8)及以下能通过Volley正常登录,API27+(含Android9)设备完全无法登录,HTTP/HTTPS请求均报错。
适配步骤
1. 解除Android9+的明文HTTP限制
Android 9(API28)开始默认禁止明文网络请求,若登录接口为HTTP协议或HTTPS配置存在问题,会直接触发请求失败。
- 快速解决:在
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"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config> - 在
AndroidManifest.xml的<application>标签中引用:android:networkSecurityConfig="@xml/network_security_config"
- 在
2. 更新Volley到最新稳定版本
旧版Volley对高API版本的网络适配存在缺陷,更新到最新版可解决大部分兼容性问题:
修改项目Module级build.gradle的依赖:
dependencies { // 替换为最新稳定版,当前最新为1.2.1 implementation 'com.android.volley:volley:1.2.1' }
3. 适配TLS 1.2+协议
部分后端仅支持旧版TLS协议(如TLS1.0/1.1),而Android9+默认优先使用TLS1.2+,会导致SSL握手失败。需强制Volley启用TLS1.2:
创建自定义SSLSocketFactory工具类:
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.SecureRandom; import java.security.cert.X509Certificate; public class SSLUtils { public static SSLSocketFactory getSSLSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, 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]; } }}, new SecureRandom()); return sslContext.getSocketFactory(); } catch (Exception e) { throw new RuntimeException(e); } } }
在Volley请求中配置:
RequestQueue queue = Volley.newRequestQueue(context); StringRequest request = new StringRequest(Request.Method.POST, url, response -> { /* 处理成功响应 */ }, error -> { /* 处理错误 */ }) { @Override protected VolleyError parseNetworkError(VolleyError volleyError) { return super.parseNetworkError(volleyError); } }; // 配置SSLSocketFactory HurlStack hurlStack = new HurlStack(null, SSLUtils.getSSLSocketFactory()); queue = Volley.newRequestQueue(context, hurlStack); queue.add(request);
4. 检查build.gradle配置
确保编译和目标SDK版本适配高版本:
android { compileSdkVersion 33 // 至少设置为API26+,推荐使用最新稳定版 defaultConfig { applicationId "com.your.app" minSdkVersion 21 // 根据你的需求调整 targetSdkVersion 33 // 与compileSdkVersion保持一致或相近 versionCode 1 versionName "1.0" } }
验证流程
- 先更新Volley版本并配置明文流量,测试Android9+设备是否能正常登录
- 若仍报错,添加TLS1.2适配代码
- 最后确认build.gradle的SDK版本配置正确
内容的提问来源于stack exchange,提问作者katmoons
相关产品推荐
相关产品推荐

