You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何播放URL音频?已尝试代码但未能运行

在Flutter中播放URL音频的问题排查与解决方案

嘿,我看到你尝试用AudioPlayer播放网络音频但没成功,咱们一步步来排查问题并搞定它。

首先要提醒你:现在官方维护的音频包是audioplayers(不是旧版的audio_player),新版本API有不少变化,这很可能是你代码失效的核心原因之一。下面是具体的修复步骤:

1. 确保依赖配置正确

先检查你的pubspec.yaml,添加最新稳定版的依赖:

dependencies:
  flutter:
    sdk: flutter
  audioplayers: ^4.0.0 # 建议去pub.dev查看最新稳定版本号

然后运行flutter pub get更新依赖。

2. 处理Android/iOS的HTTP网络限制

你的音频URL是HTTP协议,而Android 9+和iOS默认会阻止明文HTTP请求,这会直接导致音频无法加载:

Android端配置

  • 在android/app/src/main/res/xml目录下创建network_security_config.xml(如果xml目录不存在就新建),内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 只允许目标域名的明文请求,比全局允许更安全 -->
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">thedemos.in</domain>
    </domain-config>
</network-security-config>
  • 打开android/app/src/main/AndroidManifest.xml,在<application>标签里添加配置:
android:networkSecurityConfig="@xml/network_security_config"

同时别忘了添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

iOS端配置

打开ios/Runner/Info.plist,添加以下内容允许指定域名的HTTP请求:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>thedemos.in</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

3. 修复播放代码(适配新版API)

新版本的audioplayers需要用UrlSource包装网络URL,而且建议添加错误捕获,方便排查问题:

import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart';

// 假设这是你的StatefulWidget的State类内代码
AudioPlayer _audioPlayer = AudioPlayer();
bool isPlaying = false;

void play() async {
  try {
    // 先停止之前的播放,避免冲突
    await _audioPlayer.stop();
    
    // 设置播放完成后的资源释放模式
    await _audioPlayer.setReleaseMode(ReleaseMode.stop);
    
    // 用UrlSource包装音频URL(新版API要求)
    final playState = await _audioPlayer.play(
      UrlSource('http://thedemos.in/mind/uploads/audio/WjYYX_Namaste2.mp3'),
    );
    
    if (playState == PlayerState.playing) { // 新版用枚举替代数字返回码
      setState(() {
        isPlaying = true;
      });
      print('播放成功!');
    } else {
      print('播放失败,当前状态: $playState');
    }
  } catch (e) {
    print('播放时出现异常: $e');
  }
}

注意:新版本已经不再用数字1表示成功,而是返回PlayerState.playing枚举值,这也是旧代码失效的关键原因。

4. 先验证音频URL的可用性

在浏览器里直接打开你的音频URL,确认它能正常播放。如果浏览器都无法加载,那就是服务器或URL本身的问题,和Flutter代码无关。

额外排查点

如果还是不行,可以检查这些细节:

  • 模拟器/真机的网络是否正常?
  • 有没有给App添加网络权限?
  • Flutter版本是不是稳定版?
  • audioplayers的版本是不是太旧?

内容的提问来源于stack exchange,提问作者Kiranpaul Issac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:27:55