Flutter中如何检测麦克风是否已被占用?
Flutter麦克风占用状态检测方案
目前Flutter官方没有提供直接检测麦克风是否被其他应用占用的跨平台API,你可以通过以下两种方案实现检测:
方案一:通用试启动检测(跨平台兼容,无需原生开发)
这个方案是行业内最常用的兼容方案,逻辑为排除权限问题后,尝试临时启动录音,根据启动结果判定是否被占用,具体实现可以配合permission_handler、record两个常用插件完成:
- 第一步:先向用户申请麦克风权限,确认权限已被授予
- 第二步:创建临时录音实例尝试启动,若启动抛出异常,即可判定麦克风被其他应用占用
- 第三步:如果启动成功,立刻停止销毁临时实例,返回未占用状态
示例代码如下:
import 'package:permission_handler/permission_handler.dart'; import 'package:record/record.dart'; /// 返回true表示麦克风被其他应用占用,false表示未占用/权限未授予 Future<bool> checkMicrophoneIsOccupied() async { // 先校验麦克风权限 PermissionStatus micStatus = await Permission.microphone.request(); if (micStatus != PermissionStatus.granted) { return false; } final AudioRecorder tempRecorder = AudioRecorder(); try { // 尝试启动临时录音,不需要实际保存文件 await tempRecorder.start(const RecordConfig(), path: ''); await tempRecorder.stop(); return false; } catch (e) { // 启动失败判定为麦克风被占用 return true; } finally { tempRecorder.dispose(); } }
该方案优点是适配全版本Android、iOS系统,不需要单独开发原生桥接代码;缺点是极少数定制系统不会抛出明确的占用异常,需要结合业务场景做二次校验。
方案二:原生接口检测(检测结果更精准)
如果需要更精准的检测结果,可以分别在Android、iOS原生层实现检测逻辑,通过MethodChannel把结果传递给Flutter层:
- Android端:Android 12(API 31)及以上系统可以通过
AudioManager.getActiveRecordingConfigurations()方法获取当前正在录音的应用列表,列表不为空即判定为麦克风被占用;低版本Android可以通过监听音频焦点变化、启动录音的错误回调完成检测。 - iOS端:通过
AVAudioSession.isOtherAudioPlaying属性判断是否有其他应用占用音频会话,同时捕获启动录音时抛出的AVAudioSessionErrorCodeCannotStartRecording异常,即可精准判定麦克风占用状态。
Flutter层调用原生方法的示例代码:
import 'package:flutter/services.dart'; const MethodChannel _micChannel = MethodChannel('your.app.channel/mic_check'); Future<bool> checkMicOccupiedNative() async { try { final bool result = await _micChannel.invokeMethod('checkMicOccupied'); return result; } on PlatformException catch (_) { // 调用失败降级到方案一检测 return checkMicrophoneIsOccupied(); } }
补充注意事项
- 如果需要适配通话场景下的麦克风占用,可以配合通话状态检测插件,提前给用户弹出「当前处于通话状态,无法使用录音功能」的提示,避免用户操作无响应。
- 部分国产定制Android系统对麦克风权限做了额外限制,建议优先使用方案一的试启动逻辑,兼容性更好。
内容的提问来源于stack exchange,提问作者Arsalan Umer
相关产品推荐
相关产品推荐

