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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 20:54:06