使用file_picker无法选取音频文件的技术求助
问题描述
使用file_picker包时,无法从设备中选取音频文件,但图片、视频和文档类文件可正常选取,设备中确实存在音频文件。
示例代码
import 'dart:developer'; import 'package:cloud_vault/utils/navigations.dart'; import 'package:cloud_vault/views/screens/file_upload.dart'; import 'package:cloud_vault/views/widgets/file_type.dart' as k; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import '../../utils/textstyle.dart'; class FileTypesModalSheet extends StatefulWidget { const FileTypesModalSheet({super.key}); @override State<FileTypesModalSheet> createState() => _FileTypesModalSheetState(); } class _FileTypesModalSheetState extends State<FileTypesModalSheet> { FilePicker filePicker = FilePicker.platform; Future<void> pickFile(FileType fileType) async { FilePickerResult? result = await filePicker.pickFiles( type: fileType, allowMultiple: true, allowedExtensions: fileType == FileType.custom ? ['pdf', 'doc', 'docx'] : null, ); if (result != null) { // ignore: use_build_context_synchronously navigateTo( context, FileUpload( pickedFile: result, fileType: fileType, )); } } @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( "Select a file type to upload", style: kTextStyle(context: context, size: 15), ), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ k.FileType( iconData: Icons.image, title: "Image", onTap: () => pickFile(FileType.image), ), k.FileType( iconData: Icons.video_collection_outlined, title: "Video", onTap: () => pickFile(FileType.video), ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ k.FileType( iconData: Icons.audio_file_outlined, title: "Audio", onTap: () => pickFile(FileType.audio), ), k.FileType( iconData: Icons.file_copy_outlined, title: "Document", onTap: () => pickFile(FileType.custom), ) ], ), ], ); } }
解决方案
1. 手动指定音频文件扩展名
FileType.audio默认支持的格式有限,可能不覆盖你设备中的音频格式。修改pickFile方法,为音频类型补充常见扩展名:
Future<void> pickFile(FileType fileType) async { List<String>? extensions; if (fileType == FileType.custom) { extensions = ['pdf', 'doc', 'docx']; } else if (fileType == FileType.audio) { // 按需补充更多音频格式 extensions = ['mp3', 'wav', 'flac', 'm4a', 'aac', 'ogg']; } FilePickerResult? result = await filePicker.pickFiles( type: fileType, allowMultiple: true, allowedExtensions: extensions, ); if (result != null) { navigateTo( context, FileUpload( pickedFile: result, fileType: fileType, )); } }
2. 检查并配置权限
Android:
在android/app/src/main/AndroidManifest.xml中添加对应权限:<!-- Android 12及以下 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13及以上 --> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />Android 13+需动态申请
READ_MEDIA_AUDIO权限,可借助permission_handler包实现。iOS:
在ios/Runner/Info.plist中添加权限描述:<key>NSMusicLibraryUsageDescription</key> <string>需要访问您的音乐库以选取音频文件</string>
3. 更新file_picker到最新版本
旧版本可能存在音频选取的bug,在pubspec.yaml中更新依赖:
dependencies: file_picker: ^最新版本号
执行flutter pub get完成更新。
4. 用自定义类型替代音频类型(备选方案)
若上述方法无效,可改用FileType.custom专门处理音频:
// 修改音频按钮的调用逻辑 k.FileType( iconData: Icons.audio_file_outlined, title: "Audio", onTap: () => pickAudioFiles(), ), // 新增单独的音频选取方法 Future<void> pickAudioFiles() async { FilePickerResult? result = await filePicker.pickFiles( type: FileType.custom, allowMultiple: true, allowedExtensions: ['mp3', 'wav', 'flac', 'm4a'], ); if (result != null) { navigateTo( context, FileUpload( pickedFile: result, fileType: FileType.audio, )); } }
内容的提问来源于stack exchange,提问作者Mustapha Amin
相关产品推荐
相关产品推荐

