Delphi 10.4.2 macOS项目录制麦克风音频弹出未获录音授权的问题咨询
Delphi 10.4.2 macOS 麦克风权限完整配置实现步骤
核心问题根因
你遇到的报错本质是两个环节缺失:
- 仅配置了隐私说明字段,但没有主动触发macOS的系统授权请求流程,导致授权状态一直停留在「未决定」阶段
- FMX内部的音频采集逻辑检测到非「已授权」状态时直接抛出异常,完全不会主动唤起授权弹窗
详细配置与实现步骤
1. 修正Info.plist隐私字段配置
- 严格确认
NSMicrophoneUsageDescription键名完全匹配大小写,不能出现拼写错误 - 键值不能留空,必须填写明确的权限申请说明文本,留空的说明文本会被macOS直接判定为无效配置,不会弹出授权请求
- 完成配置后必须校验最终生成的安装包:右键生成的.app文件,选择「显示包内容」,打开
Contents/Info.plist,确认NSMicrophoneUsageDescription键值真实存在。Delphi 10.4.2存在已知缓存bug,项目选项页配置的字段可能不会自动写入最终安装包,出现该问题时可以手动修改好Info.plist,在项目的部署页面将该文件添加到部署列表,目标路径设为.app/Contents/,强制覆盖IDE自动生成的默认文件。
2. 主动实现授权请求逻辑
不能依赖FMX组件自动触发授权流程,需要在初始化音频采集逻辑之前,主动调用AVFoundation的授权请求接口:
- 首先在uses单元引用中添加
Macapi.AVFoundation, Macapi.Helpers, System.Threading - 编写独立的权限请求方法,参考代码如下:
procedure RequestMicrophoneAccess; var CurrentStatus: AVAuthorizationStatus; begin CurrentStatus := TAVCaptureDevice.OCClass.authorizationStatusForMediaType(AVMediaTypeAudio); // 未决定状态下主动唤起系统授权弹窗 if CurrentStatus = AVAuthorizationStatusNotDetermined then begin TAVCaptureDevice.OCClass.requestAccessForMediaType(AVMediaTypeAudio, procedure(Granted: Boolean) begin TThread.Queue(nil, procedure begin if Granted then // 授权通过后再启动音频捕获组件的初始化 StartAudioCapture else ShowMessage('麦克风权限被拒绝,无法启动录制'); end); end); end else if CurrentStatus = AVAuthorizationStatusDenied then ShowMessage('请前往 系统设置 > 隐私与安全性 > 麦克风,为当前应用开启录制权限'); end;
- 应用启动后,先调用上述权限请求方法,等收到明确的「已授权」回调结果后,再初始化FMX的音频录制组件,避免组件内部代码检测到未授权状态直接抛出异常。
3. 调试阶段的注意事项
- 反复测试权限流程时,如果之前的授权状态异常,可以打开macOS的「系统设置 > 隐私与安全性 > 麦克风」,删除当前测试应用的权限记录,重置授权状态后再重新运行
- 临时调试的未签名应用如果始终不弹出授权框,可以先将应用拖到「应用程序」文件夹下再运行,避免因为运行在临时目录被系统判定为可疑程序,拦截授权弹窗
内容的提问来源于stack exchange,提问作者Mike at Bookup
相关产品推荐
相关产品推荐

