Flutter audioplayers插件仅Android端无法播放远程服务器音频的问题求助
Flutter audioplayers插件仅Android端无法播放远程服务器音频的问题求助
看起来你遇到了一个挺闹心的问题——同一个远程MP3链接在Linux、Chrome上都能正常播放,偏偏用Flutter的audioplayers插件在Android端就报错,而且日志里的错误信息还没给太多细节,我来帮你梳理下可能的排查方向和解决方案。
先帮你把核心信息理清楚:
- 你用的是
UrlSource加载远程音频,代码逻辑在Linux和Chrome上没问题 - Android端日志里的关键错误是
E/MediaPlayerNative(20411): error (1, -2147483648),对应插件抛出的MEDIA_ERROR_UNKNOWN - 对比了Github的HTTPS链接和你的HTTP链接,后者加了CORS但依然无法播放
结合这些信息,我觉得有几个非常值得优先排查的点:
1. CORS配置里的语法错误(最可能的元凶)
我仔细对比了你和Github服务器的响应头,发现你服务器的Access-Control-Allow-Methods头有个明显的语法问题:
Access-Control-Allow-Methods: GET, POST. OPTIONS, PUT, DELETE
这里POST后面跟的是点号而不是逗号,这会导致Android的MediaPlayer解析CORS规则时出错——毕竟CORS头里的方法列表要求用逗号分隔。你需要在Nginx配置里把这个点号改成逗号,正确的写法应该是:
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE
修改后重启Nginx,再测试下音频播放。
2. Android 9.0+默认禁止明文HTTP请求
从Android 9.0(API 28)开始,系统默认会阻止明文HTTP请求,而你的服务器用的是HTTP协议,Github的是HTTPS,这刚好对应了两者的播放差异。解决这个问题需要在安卓项目里做配置:
- 打开
android/app/src/main/AndroidManifest.xml,在<application>标签中添加属性:android:usesCleartextTraffic="true" - 如果你的App目标SDK是30+,可能还需要配置网络安全策略:在
res/xml目录下创建network_security_config.xml,内容如下:
然后在AndroidManifest的<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config><application>标签里关联这个配置:android:networkSecurityConfig="@xml/network_security_config"
3. 其他可能的排查点
如果上面两个方法都没用,你可以再检查这些细节:
- 确认服务器返回的MP3文件没有损坏:可以用curl下载你服务器的音频文件,本地验证能否播放
- 检查服务器是否有防盗链、UA拦截等规则:有些服务器会拦截来自MediaPlayer的请求,可以模拟Android MediaPlayer的UA请求测试,比如用命令:
curl -v http://213.165.70.5/samples/sample.mp3 -H "User-Agent: Mozilla/5.0 (Linux; U; Android 10; en-us; SM-G975U Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36" - 尝试更新audioplayers插件到最新版本:旧版本可能存在Android MediaPlayer的兼容性问题
内容来源于stack exchange




