使用Volley无法连接HTTP站点(Android/Kotlin,HTTPS正常)
问题分析与解决方案
核心原因
你遇到的问题确实和HTTP/HTTPS的差异有关:Android 9(API级别28)及以上版本默认禁止明文HTTP网络请求,仅允许HTTPS协议的请求。你的Pico设备和测试的Columbia站点都使用HTTP,因此被系统拦截;而Google站点是HTTPS协议,所以能正常请求。
快速解决方法(测试环境)
如果只是开发测试阶段,最简单的方式是在AndroidManifest.xml的<application>标签中添加全局允许明文请求的配置:
<application ... android:usesCleartextTraffic="true"> ... </application>
注意:该配置存在安全风险,不建议在正式发布的App中使用。
更安全的解决方案(推荐)
针对特定的本地IP或域名单独允许明文请求,需要配置网络安全策略:
- 在
res/xml目录下创建network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- 允许你的Pico本地IP的明文请求 --> <domain includeSubdomains="true">192.168.0.201</domain> <!-- 若需测试其他HTTP站点,可添加对应域名 --> <domain includeSubdomains="true">columbia.edu</domain> </domain-config> </network-security-config>
- 在
AndroidManifest.xml的<application>标签中引用该配置:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
优化错误排查
当前代码的错误回调仅打印固定信息,建议修改为输出具体错误详情,方便定位问题:
val stringRequest = StringRequest(Request.Method.GET, url, { response -> println(url) println("response:") println(response) println("end of response") }, { error -> println("that didn't work") println(url) // 打印错误状态码和消息 println("Error code: ${error.networkResponse?.statusCode ?: "Unknown"}") println("Error message: ${error.message ?: "No message"}") })
其他控制LED灯带的方案
除了HTTP接口,还可以考虑以下更适合物联网场景的方式:
- MQTT协议:Pico作为MQTT客户端,Android App通过MQTT Broker发送控制指令,延迟更低,适合批量设备管理。
- WebSocket:建立长连接实现实时双向通信,适合需要即时响应的控制场景。
- 蓝牙BLE:给Pico添加蓝牙模块,通过蓝牙直接通信,无需依赖WiFi网络。
内容的提问来源于stack exchange,提问作者Elio
相关产品推荐
相关产品推荐

