Flutter:使用audioplayers播放应用内下载音乐路径报错问题
解决Flutter中加载应用内部存储音乐并播放的问题
问题原因
直接硬编码路径data/user/0/{appName}/app_flutter/{fileName}的方式不可靠:
- 不同设备、应用签名变更都会导致内部存储路径变化,硬写的路径可能与实际存储路径不匹配
- 未确认下载文件是否真的保存在该路径下,flutter_downloader的存储路径需通过插件API或路径工具类获取,而非手动拼接
解决方案步骤
1. 依赖准备
确保pubspec.yaml中包含以下依赖:
dependencies: flutter_downloader: ^1.10.2 audioplayers: ^3.0.1 path_provider: ^2.0.15 # 用于获取应用内部存储路径
2. 获取下载文件的真实路径
方式一:从flutter_downloader任务信息中获取
下载完成后,通过任务ID定位目标文件路径:
import 'package:flutter_downloader/flutter_downloader.dart'; // 获取所有已下载任务 final tasks = await FlutterDownloader.loadTasks(); // 根据任务ID找到对应任务 final targetTask = tasks?.firstWhere((task) => task.taskId == "你的下载任务ID"); final filePath = targetTask?.filePath;
方式二:通过path_provider拼接路径
如果下载时指定了存储目录,直接用path_provider获取应用文档目录后拼接文件名:
import 'package:path_provider/path_provider.dart'; // 获取应用专属内部文档目录 final appDir = await getApplicationDocumentsDirectory(); // 拼接完整文件路径(替换为你的实际文件名) final filePath = "${appDir.path}/target_song.mp3";
3. 检查文件存在性并播放
播放前先验证文件是否存在,避免抛出找不到文件的错误:
import 'package:audioplayers/audioplayers.dart'; import 'dart:io'; if (filePath != null && File(filePath).existsSync()) { final player = AudioPlayer(); // 传入真实文件路径到DeviceFileSource await player.play(DeviceFileSource(filePath)); } else { print("文件不存在或路径为空"); }
4. 优化flutter_downloader下载配置
下载时明确指定存储目录,确保文件路径可预测:
final taskId = await FlutterDownloader.enqueue( url: "你的歌曲下载链接", savedDir: (await getApplicationDocumentsDirectory()).path, // 指定应用文档目录 fileName: "custom_song_name.mp3", showNotification: true, openFileFromNotification: true, );
关键注意事项
- 禁止硬编码内部存储路径,必须使用
path_provider提供的API获取应用专属目录 - 播放前必须检查文件存在性,避免触发
FileNotFoundException - 确保flutter_downloader的下载存储目录与播放时使用的路径完全一致
内容的提问来源于stack exchange,提问作者Khyati Modi
相关产品推荐
相关产品推荐

