Flutter iOS端如何选择音乐文件夹并获取其路径
iOS端Flutter访问音乐文件夹与媒体音乐的解决方案
一、为什么file_picker看不到Music应用里的音乐?
iOS的Music应用音乐存储在系统媒体库,属于沙盒外的受保护区域,普通文件选择器(包括file_picker)无法直接访问。只有通过系统提供的媒体库权限API才能获取这些音乐资源。
二、实现方案
1. 访问用户自定义的音乐文件夹(文件系统内的)
如果用户的音乐存在iCloud Drive或本地文件系统的文件夹里,file_picker可以正常选择,但需先配置iOS权限:
- 在
Info.plist中添加NSFileProviderDomainUsageDescription和NSDocumentPickerUsageDescription,填写访问文件的用途说明。 - 调用file_picker的文件夹选择方法:
String? selectedDir = await FilePicker.platform.getDirectoryPath(); if (selectedDir != null) { // 处理选中的文件夹路径,遍历其中的音乐文件 }
2. 访问Music应用内的音乐资源
要获取系统媒体库的音乐,需借助媒体库相关的Flutter包,步骤如下:
- 配置权限:在
Info.plist中添加NSAppleMusicUsageDescription,说明访问媒体库的用途。 - 获取媒体库音乐列表:使用
flutter_media_metadata包扫描系统媒体库,获取音乐的元数据与路径:
import 'package:flutter_media_metadata/flutter_media_metadata.dart'; Future<void> fetchLibraryMusic() async { final List<Metadata> musicTracks = await MetadataRetriever.retrieveMedia(); for (var track in musicTracks) { print('音乐名称: ${track.trackName}, 文件路径: ${track.filePath}'); // 将这些信息展示给用户选择 } }
- 播放音乐:用
just_audio包加载获取到的路径进行播放:
import 'package:just_audio/just_audio.dart'; final audioPlayer = AudioPlayer(); await audioPlayer.setFilePath(selectedTrack.filePath); audioPlayer.play();
3. 结合两种场景
在应用中设置两个入口:一个是「选择本地文件夹」(用file_picker),另一个是「从音乐库选择」(用媒体库API),覆盖用户不同的音乐存储场景。
三、注意事项
- iOS 14及以上版本必须配置完整的隐私权限描述,否则应用会崩溃或无法访问资源。
- 系统媒体库返回的音乐路径是沙盒映射路径,可直接用于播放,无需解析真实物理路径。
- 若支持iCloud音乐库,需确保用户开启同步,并在应用中配置对应的iCloud权限。
内容的提问来源于stack exchange,提问作者MarcoF
相关产品推荐
相关产品推荐

