uni.getScreenBrightness() 返回的是应用窗口亮度快照:iOS 等价 UIScreen.brightness(0.0–1.0,自动亮度下仍变化但无通知);Android 返回 window brightness(与系统滑块脱钩,需 WRITE_SETTINGS 权限+原生监听才能获取真实系统值)。

不能实时获取系统亮度变化,只能轮询读取快照值;iOS 可读但无变更通知,Android 需权限且值不反映系统滑块状态。
uni.getScreenBrightness() 返回的到底是什么
这个 API 在 App 端返回的是当前「应用窗口」的亮度快照,不是系统设置里的实时滑块值:
• iOS 上它等价于 UIScreen.mainScreen().brightness,范围 0.0–1.0,但该值在自动亮度开启时仍会变化,且无事件触发;
• Android 上它返回的是当前 Activity 的 window brightness(通过 Window.getAttributes().screenBrightness),和 Settings 中的滑块完全脱钩 —— 用户拖动系统亮度条,这个值不会自动更新;
• uni.getSystemInfoSync().screenBrightness 在 App 端始终为 undefined,别用它。
Android 要读系统级亮度必须走 WRITE_SETTINGS 权限
想拿到 Settings.System.SCREEN_BRIGHTNESS(0–255 整数)对应的值,得自己写原生逻辑并申请权限:
• manifest.json 中必须声明 "android.permission.WRITE_SETTINGS";
• 运行时不能用 uni.authorize,得调用 uni.openSetting 弹出系统页,引导用户手动打开「修改系统设置」开关;
• 权限获批后,需通过 ContentObserver 监听 Settings.System.SCREEN_BRIGHTNESS,再把整数映射为 0–1 浮点(除以 255.0);
• Android 8.0+ 才支持该监听,旧版本只能轮询(不推荐);
• 华为、小米等厂商可能拦截该监听,fail 回调会触发但无具体错误码。
iOS 只能轮询,且频率不能太高
iOS 没有系统级亮度变更通知,官方 API 也不暴露 KVO 或通知机制:
• 唯一办法是定时调用 uni.getScreenBrightness() 获取当前值;
• 轮询间隔建议 ≥500ms,否则容易被系统限频或导致耗电升高;
• 注意:即使用户开启了「自动亮度」,UIScreen.mainScreen().brightness 仍会随环境光变化,但你无法区分是手动还是自动导致的;
• 无法获知「自动亮度」开关是否开启,也无法监听其切换事件。
别指望 onShow/onHide 触发时机来“感知变化”
很多开发者试图在 onShow 里读亮度,以为能捕获用户退出 App 后手动调的值 —— 实际上:
• onShow 不代表亮度变了,只是页面重新显示;
• 某些 Android 设备在亮度变化瞬间会重绘甚至再次触发 onShow,导致无限循环调用 uni.getScreenBrightness();
• onHide 也不可靠,App 进入后台时可能不触发,尤其在省电模式下;
• 如果真需要响应变化,必须由原生插件主动发事件(如 uni.$on('brightnessChange', callback)),JS 层无法靠生命周期兜底。
真正可靠的亮度感知,只存在于原生层;JS 层拿到的永远是某个时刻的采样值,而且平台行为差异极大。轮询不是懒,是现状所迫;权限不是障碍,是 Android 的设计约束。别在没确认权限或没处理 undefined 的情况下直接存 res.value,那会让你的还原逻辑在低端机上静默失效。


















