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

如何在Flutter应用中从文件管理器选取音频文件并实现播放功能

Flutter本地选中音频文件播放实现方案

1. 配置音频播放依赖

使用audioplayers库实现本地音频播放,先在pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  file_picker: ^5.2.10
  audioplayers: ^4.0.1

配置完成后执行flutter pub get安装依赖。

平台权限配置

  • 安卓端:在android/app/src/main/AndroidManifest.xml的<manifest>标签下添加权限:
    <!-- 安卓13以下读取存储权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 安卓13及以上读取音频权限 -->
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    
  • iOS端:在ios/Runner/Info.plist的<dict>标签下添加配置:
    <key>NSMicrophoneUsageDescription</key>
    <string>需要访问麦克风音频相关权限</string>
    <!-- 如果需要后台播放可以添加以下配置 -->
    <key>UIBackgroundModes</key>
    <array>
      <string>audio</string>
    </array>
    

2. 改造现有代码实现播放逻辑

新增变量定义

在_FilePickerDemoState类中新增播放器实例和选中音频路径变量:

import 'package:audioplayers/audioplayers.dart';

class _FilePickerDemoState extends State<FilePickerDemo> {
  final AudioPlayer _audioPlayer = AudioPlayer();
  String? _selectedAudioPath;
  // 原有变量保持不变:_paths、_isLoading、_fileName、_multiPick等
  // 原有代码中_pickingType需要设置为FileType.custom,否则allowedExtensions配置不生效
  final FileType _pickingType = FileType.custom;
  final bool _multiPick = false;

修改文件选择逻辑

在原有_pickFiles方法的setState逻辑中新增选中音频路径赋值:

setState(() {
  _isLoading = false;
  _fileName = _paths != null ? _paths!.map((e) => e.name).toString() : '...';
  _userAborted = _paths == null;
  // 新增:保存选中的第一个音频文件路径
  if (_paths != null && _paths!.isNotEmpty) {
    _selectedAudioPath = _paths!.first.path;
  }
});

新增播放控制方法

// 播放音频
Future<void> _playSelectedAudio() async {
  if (_selectedAudioPath == null) return;
  // 停止之前正在播放的音频
  await _audioPlayer.stop();
  // 播放选中的本地音频文件
  await _audioPlayer.play(DeviceFileSource(_selectedAudioPath!));
}

// 暂停播放
Future<void> _pauseAudio() async {
  await _audioPlayer.pause();
}

// 停止播放
Future<void> _stopAudio() async {
  await _audioPlayer.stop();
}

// 页面销毁时释放播放器资源
@override
void dispose() {
  _audioPlayer.dispose();
  super.dispose();
}

新增控制按钮

在build方法中新增播放、暂停、停止按钮即可调用上述方法实现控制。

3. 注意事项

  • 仅选中单个音频的场景可以直接取_paths!.first.path,如果开启了多选需要自行处理播放列表逻辑
  • 如需实现进度展示、音量调节、播放列表循环等功能,可以直接使用audioplayers库提供的对应API实现

内容的提问来源于stack exchange,提问作者Poornima Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:36:03