Flutter实现通话时贴近面部自动熄屏并切换听筒输出功能
你需要的是手机内置的接近传感器(Proximity Sensor),绝大多数智能手机都预装了该传感器,就是为了实现通话时贴近耳部熄屏防误触的场景,Flutter生态有成熟的方案可以直接调用该传感器能力,同时配套实现音频切换逻辑:
1. 接近传感器监听实现
- 可以直接调用封装好的传感器类package,无需自行开发原生桥接逻辑,核心监听代码如下:
import 'package:proximity_sensor/proximity_sensor.dart'; import 'dart:async'; StreamSubscription<int>? _proximitySub; // 初始化传感器监听 void initProximityDetect() { _proximitySub = ProximitySensor.events.listen((event) { // event返回0代表传感器被遮挡,即用户贴近耳部/面部 bool isUserNear = event == 0; if (isUserNear) { // 触发熄屏、切换音频到听筒 handleNearEvent(); } else { // 触发亮屏、恢复原有音频输出 handleFarEvent(); } }); } // 页面销毁时取消订阅避免内存泄漏 @override void dispose() { _proximitySub?.cancel(); super.dispose(); }
- 安卓端需要在
android/app/src/main/AndroidManifest.xml中添加权限声明:
<!-- 接近传感器控制熄屏权限 --> <uses-permission android:name="android.permission.PROXIMITY_SCREEN_OFF_WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
2. 音频输出切换实现
- 推荐搭配
audio_session包配置通话类音频会话,系统会自动适配接近传感器触发时的音频输出逻辑,无需手动强制切换:
final audioSession = await AudioSession.instance; await audioSession.configure(AudioSessionConfiguration( // iOS端配置通话类音频 avAudioSessionCategory: AVAudioSessionCategory.playAndRecord, avAudioSessionMode: AVAudioSessionMode.voiceChat, // 安卓端配置通话类音频 androidAudioUsage: AndroidAudioUsage.voiceCommunication, androidAudioContentType: AndroidAudioContentType.speech, ));
- 配置完成后,系统会自动在贴近耳部时将音频输出切换到听筒,远离时恢复到扬声器/蓝牙等原有输出设备。
适配注意事项
- 部分定制ROM会默认禁用第三方应用的接近传感器调用权限,需要做权限申请和异常兼容
- 不要直接强制调用系统熄屏API,使用传感器配套的系统熄屏逻辑即可,避免和系统自带的通话逻辑冲突
内容的提问来源于stack exchange,提问作者Zhu
相关产品推荐
相关产品推荐

