如何在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
相关产品推荐
相关产品推荐

