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
相关产品推荐
相关产品推荐

