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

Flutter中如何申请设备麦克风权限以实现音频录制功能

Flutter 麦克风权限申请与音频录制实现方案

1. 添加依赖

在项目的pubspec.yaml文件中添加如下依赖:

dependencies:
  flutter:
    sdk: flutter
  permission_handler: ^11.0.1 # 权限处理组件
  record: ^5.0.4 # 音频录制组件
  # 如果需要获取设备存储路径存储录音,额外添加以下依赖
  path_provider: ^2.1.0

添加完成后执行flutter pub get完成依赖安装。

2. 各平台权限配置

2.1 Android 平台配置

打开android/app/src/main/AndroidManifest.xml文件,在<manifest>标签内部、<application>标签外部添加麦克风权限声明:

<!-- 麦克风访问权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 适配Android 12及以下版本存储需求,Android 13+使用应用专属目录无需额外申请 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

2.2 iOS 平台配置

打开ios/Runner/Info.plist文件,在<dict>标签内部添加麦克风权限说明:

<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风以完成音频录制功能</string>
<!-- 如果需要存储录音到本地,额外添加存储权限说明 -->
<key>NSDocumentDirectoryUsageDescription</key>
<string>需要访问文件存储以保存录制的音频文件</string>

3. 麦克风权限申请逻辑

import 'package:permission_handler/permission_handler.dart';

// 封装麦克风权限申请方法,返回值表示是否获得授权
Future<bool> requestMicrophonePermission() async {
  PermissionStatus currentStatus = await Permission.microphone.status;
  // 已有授权直接返回成功
  if (currentStatus.isGranted) return true;
  // 权限被临时拒绝,重新发起申请
  if (currentStatus.isDenied) {
    PermissionStatus newStatus = await Permission.microphone.request();
    return newStatus.isGranted;
  }
  // 权限被永久拒绝,跳转应用设置页引导用户手动开启
  if (currentStatus.isPermanentlyDenied) {
    openAppSettings();
    return false;
  }
  return false;
}

4. 基础音频录制功能实现

import 'package:record/record.dart';
import 'package:path_provider/path_provider.dart';

// 初始化录音实例
final AudioRecorder _audioRecorder = AudioRecorder();

// 开始录音
Future<void> startRecord() async {
  // 先校验麦克风权限
  bool hasPermission = await requestMicrophonePermission();
  if (!hasPermission) return;

  // 配置录音参数
  const RecordConfig recordConfig = RecordConfig(
    encoder: AudioEncoder.aacLc,
    sampleRate: 44100,
    bitRate: 128000,
  );
  // 生成临时存储路径,也可自定义路径存储
  String savePath = '${(await getTemporaryDirectory()).path}/my_recording.aac';
  await _audioRecorder.start(recordConfig, path: savePath);
}

// 停止录音,返回录音文件存储路径
Future<String?> stopRecord() async {
  if (await _audioRecorder.isRecording()) {
    return await _audioRecorder.stop();
  }
  return null;
}

// 页面销毁时释放录音资源
@override
void dispose() {
  _audioRecorder.dispose();
  super.dispose();
}

注意:如果不需要长期保存录音文件,优先使用应用临时目录存储,可避免申请多余的存储权限,降低权限申请被用户拒绝的概率。

内容的提问来源于stack exchange,提问作者Big Tree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:54:04