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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:45:31