更新记录

1.0.0(2026-08-14) 下载此版本

获取Android系统环境光照值(Lux)- plus.android零插件方案


平台兼容性

uni-app(3.8.2)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - 5.0 - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-light-sensor(零插件方案)

通过 plus.android Native.js 直接调用 Android SensorManager,获取环境光照值(Lux) 标准基座即可运行,无需编写 Java、无需自定义基座、无需原生插件

原理

uni-app 的 5+ Runtime 提供了 Native.js 能力(plus.android),允许在 JS 中直接调用 Android 原生 Java 类。 本方案通过 plus.android.importClass 导入 SensorManagerSensorSensorEventListener 等类, 用 plus.android.implements 实现传感器监听接口,完全在 JS 层完成,零原生代码。

考虑到部分 Android 调试基座下 SensorEvent 的公有字段映射不稳定,当前实现还补充了 plus.android.getAttribute 的兼容读取逻辑,用于稳定获取 valuesaccuracytimestamp

文件结构(HBuilderX 标准模板)

uni-light-sensor/
├── pages/
│   ├── index/
│   │   └── index.vue                  # 首页(入口导航)
│   └── light-sensor/
│       └── light-sensor.vue           # 光照检测页面
├── utils/
│   └── light-sensor.js                # 核心封装(零插件,纯 JS 调用原生)
├── App.vue                            # 应用入口
├── main.js                            # 主入口(兼容 Vue2/Vue3)
├── manifest.json                      # 应用配置
├── pages.json                         # 页面路由配置
└── README.md

快速使用

1. 引入

import LightSensor from '@/utils/light-sensor.js';

2. 检测传感器是否可用

const available = LightSensor.isAvailable();
console.log('光照传感器:', available ? '可用' : '不可用');

3. 实时监听光照变化

LightSensor.startListening((data) => {
    console.log('光照度:', data.lux, 'Lux');
    console.log('精度:', data.accuracy);
    console.log('时间戳:', data.timestamp);
}, {
    samplingPeriodUs: 200000  // 采样间隔,单位微秒,默认 200ms
});

4. 停止监听

LightSensor.stopListening();

5. 单次获取

try {
    const data = await LightSensor.getLightLevel();
    console.log('当前光照度:', data.lux, 'Lux');
} catch (e) {
    console.error('单次获取失败:', e.message);
}

API 参考

方法 参数 返回值 说明
isAvailable() boolean 检测是否有光照传感器
startListening(callback, options?) callback: 数据回调
options.samplingPeriodUs: 采样间隔
void 开始实时监听
stopListening() void 停止监听,释放资源
getLightLevel() Promise<{lux, accuracy, timestamp}> 单次获取光照值,3 秒超时会 reject

采样间隔参考

Android 常量 值(微秒) 说明
SENSOR_DELAY_FASTEST 0 最快,适合游戏
SENSOR_DELAY_GAME 20000 20ms
SENSOR_DELAY_UI 200000 200ms,UI 交互(默认)
SENSOR_DELAY_NORMAL 200000 普通速率

回调数据结构

{
    lux: number,        // 光照度(单位 Lux)
    accuracy: number,   // 精度等级:0=不可靠, 1=低, 2=中, 3=高
    timestamp: number   // 传感器事件时间戳(纳秒)
}

Lux 参考值

Lux 范围 环境
< 10 极暗 - 夜间室内
10 ~ 50 昏暗 - 弱光环境
50 ~ 200 适中 - 普通室内
200 ~ 500 明亮 - 办公室照明
500 ~ 1000 很亮 - 阴天室外
1000 ~ 10000 强烈 - 晴天室外
> 10000 极强 - 直射阳光

注意事项

  1. 仅支持 Android:iOS 不开放环境光传感器 API
  2. 标准基座可用:无需自定义基座,直接运行调试
  3. 非 App 平台默认不可用:页面层会直接提示“当前设备无光照传感器或非 Android 环境”,并禁用监听与单次获取按钮
  4. 条件编译:代码中使用了 #ifdef APP-PLUS 条件编译,H5/小程序端不会执行原生调用
  5. 页面卸载清理:务必在 onUnload 中调用 stopListening() 释放传感器资源
  6. 单次获取超时getLightLevel() 在 3 秒内未收到传感器回调时会抛出 获取光照值超时
  7. 权限:光照传感器属于普通传感器,Android 6.0+ 无需动态申请权限

dcloud 上架说明

  • 本方案不引入任何原生插件,不影响上架审核
  • 无需在 manifest.json 中声明额外权限(光照传感器非敏感权限)
  • 仅 Android 可用,iOS 端需做兼容处理(代码已内置条件编译)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<uses-permission android:name="android.permission.INTERNET"/>

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。