You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    
    然后在AndroidManifest的<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

火山引擎 最新活动