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

Flutter安卓录音存储权限问题:权限未授予致录音失败

解决Android 13录音App权限未授予问题

1. 补充核心录音权限

Android 13录音必须声明RECORD_AUDIO权限,你的AndroidManifest.xml漏掉了这个关键权限,立即添加:

<uses-permission android:name="android.permission.RECORD_AUDIO" />

该权限属于危险权限,必须配合动态请求(你代码中已请求Permission.microphone,对应此权限),但前提是先在Manifest中声明。

2. 适配Android 13存储权限规则

Android 13(API 33+)废弃了READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE,改用媒体细分权限。但如果录音文件存储到应用私有目录,完全不需要申请存储权限——系统默认允许应用读写自身私有目录。

优先优化存储路径(推荐)

将录音路径改为应用私有外部存储目录,彻底绕过存储权限请求:

// 替换原Paths.recording为私有目录路径
Directory appFolder = await getExternalFilesDir(Environment.DIRECTORY_MUSIC);
// 或使用内部私有目录
// Directory appFolder = await getApplicationDocumentsDirectory();

调整后可直接删除代码中Permission.storage的请求,减少权限申请环节,避免权限被拒绝风险。

3. 修正动态权限请求逻辑(若需公共目录存储)

如果必须存储到公共媒体目录,Android 13需请求READ_MEDIA_AUDIO权限(WRITE_MEDIA_AUDIO无需动态请求,仅需Manifest声明)。原代码中Permission.storage在API33+已失效,需按版本适配:

Map<Permission, PermissionStatus> permissions;
final androidInfo = await DeviceInfoPlugin().androidInfo;
if (Platform.isAndroid && androidInfo.version.sdkInt >= 33) {
  permissions = await [
    Permission.microphone,
    Permission.audio, // 对应READ_MEDIA_AUDIO
  ].request();
} else {
  permissions = await [
    Permission.microphone,
    Permission.storage,
  ].request();
}

同时更新Manifest权限声明:

<!-- API33+ 音频媒体权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.WRITE_MEDIA_AUDIO" />
<!-- 兼容API32及以下存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

4. 排查权限拒绝详情

在代码中添加权限状态日志,明确哪个权限被拒绝:

print('麦克风权限状态: ${permissions[Permission.microphone]}');
final androidInfo = await DeviceInfoPlugin().androidInfo;
if (Platform.isAndroid && androidInfo.version.sdkInt >= 33) {
  print('音频媒体权限状态: ${permissions[Permission.audio]}');
} else {
  print('存储权限状态: ${permissions[Permission.storage]}');
}

5. 移除冗余权限

你的Manifest中MANAGE_EXTERNAL_STORAGE是用于全文件访问的特殊权限,普通录音App完全不需要,直接删除该声明,避免不必要的权限流程干扰。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:53:24