android需write_settings权限且value:-1才同步系统亮度,ios直接支持;hbuilderx

不能直接“设系统亮度”,iOS 可以,Android 默认只改应用内窗口亮度;想同步系统值,Android 必须传 value: -1 并提前申请 WRITE_SETTINGS 权限。
uni.setScreenBrightness 在 Android 上不生效的真正原因
打包后调用 uni.setScreenBrightness() 无反应,大概率不是代码写错,而是缺权限或没配置:
- manifest.json 中没声明
"android.permission.WRITE_SETTINGS"(注意:不是WAKE_LOCK) - 运行时没检查
res.authSetting['scope.writeSettings'],也未调用uni.openSetting()引导用户开启「修改系统设置」开关 - HBuilderX 版本低于
3.2.11,value: -1会被静默忽略,降级为无效的窗口亮度设置 - 华为 EMUI、小米 MIUI 等在省电模式下会拦截该调用,
fail回调会触发但无具体错误码
为什么不能在 onShow 里无条件调用
某些 Android 设备(尤其是旧款 OPPO、三星)在亮度变化瞬间会触发页面重绘,甚至再次执行 onShow,形成死循环——CPU 升高、页面卡死、fail 频发。
- 官方明确禁止在
onShow或onLoad中无防护调用 - 推荐改用
onReady+setTimeout(..., 100)防抖 - 若必须进页即设,加标记位:
if (!this._brightnessSet) { uni.setScreenBrightness({ value: 0.9 }); this._brightnessSet = true; }
临时提亮(如扫码页)后如何安全还原
关键不在“设多亮”,而在“记什么”和“什么时候还”:
- 进入前必须用
uni.getScreenBrightness()获取当前值,存入uni.setStorageSync('prev_brightness');注意 fallback:Number(res.value) || 0.5,因为低端机可能返回undefined - 还原动作必须放在
onUnload(不是onHide),否则部分场景(如扫码后跳转、原生导航返回)下onHide不触发 - iOS 直接设回存储值;Android 建议设
value: -1(同步系统)或原值(若确定未被厂商拦截) -
setKeepScreenOn和亮度无关,它只防息屏,屏幕仍可为纯黑——别把它当亮度 API 用
平台差异藏得深:iOS 的 getScreenBrightness 返回的是系统级快照,Android 默认返回的是窗口级快照,且两者对 value: -1 的响应完全不同。别依赖一次调用就“搞定”,得按平台分路径处理,尤其要注意权限弹窗时机和还原回调的生命周期钩子选择。











