不存在独立的 uni.toggleflashlight() 等标准 api;uni-app 官方未封装手电筒控制能力,必须通过 uts 插件调用原生 android/ios 硬件接口实现,且需处理厂商拦截、状态不可靠等兼容性问题。

uni-app 调用手电筒 API 是否存在?
不存在独立的 uni.toggleFlashlight() 或类似标准 API。uni-app 官方未封装手电筒控制能力,plus.device 里的 setTorchMode() 是 5+ App(即旧版原生引擎)接口,在当前主流 uni-app(基于 WebView + nvue 或 UTS 插件)中**不可用**,直接调用会报 plus is not defined 或静默失败。
安卓/iOS 手电筒必须用原生能力,推荐 UTS 插件方案
从 HBuilderX 4.34 起,UTS(Uni TypeScript)是官方推荐的原生扩展方式,比旧版 nativePlugin 更稳定、类型安全、可调试。手电筒属于系统级硬件控制,必须走 UTS。
- 新建
uni_modules/uts-flashlight目录,按 UTS 规范编写index.uts - Android 端调用
CameraManager+CameraCharacteristics.LENS_INFO_AVAILABLE_LENS_FOCAL_LENGTHS判断是否支持闪光灯,再用setTorchMode(true/false) - iOS 端调用
AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)?.hasTorch判断,再用lockForConfiguration()+torchMode = .on/.off - 插件需在
package.json中声明"platforms": { "app-android": {...}, "app-ios": {...} } - 调用时:
const flashlight = uni.requireNativePlugin('uts-flashlight'); flashlight.toggle();
常见失败原因和绕过限制
即使 UTS 插件写对了,仍可能失败:
- Android 厂商拦截:华为 EMUI、小米 MIUI 在后台或省电模式下会强制关闭闪光灯,
fail回调会触发,但无具体错误码;建议加 UI 提示“请关闭省电模式” - iOS 权限无弹窗:iOS 不需要额外权限,但设备必须有后置摄像头且带 LED(部分 iPad 不支持),
hasTorch返回false时应禁用按钮 - 未在
onReady后调用:nvue 页面中若在onLoad就调用,可能因原生视图未就绪而失败;务必等onReady或用户点击事件中触发 - 连续快速开关:某些 Android 设备对
setTorchMode频率敏感,需加防抖(如间隔 300ms)
扫码页集成手电筒的典型写法
结合扫码场景,手电筒常作为浮层按钮,点击即开/关,且需与亮度调节协同:
- 按钮绑定
@click="toggleFlashlight",不放在onShow自动触发(避免误触和兼容问题) -
toggleFlashlight内先查状态:flashlight.getState()(UTS 插件需暴露该方法),再决定开或关 - 开启时同步调高屏幕亮度:
uni.setScreenBrightness({ value: 1 });关闭时恢复之前存的值(见uni.getStorageSync('saved_brightness')) - iOS 下手电筒关闭后,建议延迟 100ms 再恢复亮度,避免视觉闪烁
真正难的不是“怎么开”,而是“怎么判断它到底开了没”——厂商定制 ROM 和 iOS 硬件差异会让返回状态不可靠,必须配合 UI 反馈(如按钮图标切换、震动提示)来掩盖底层不确定性。











