Android需传value: -1并动态申请WRITE_SETTINGS权限才能同步系统亮度,iOS直接设置即生效;HBuilderX 3.2.11+、Android 5.0+才支持,华为小米等厂商可能拦截。
不能直接“在app内调整系统亮度”——ios可以,android默认不行;必须传 value: -1 才可能同步系统级亮度,且仅限 android 5.0+、hbuilderx 3.2.11+,部分厂商(华为、小米)还会拦截。
uni.setScreenBrightness({value: -1}) 只对 Android 有效
iOS 调用 uni.setScreenBrightness({value: 0.8}) 就是改系统亮度,退出 App 后仍保留;Android 默认只改当前应用窗口亮度,和系统设置无关。想同步系统值,必须显式传 value: -1,否则哪怕设成 1,也只是让当前页面看起来亮,系统设置栏里的亮度滑块纹丝不动。
-
value: -1是 Android 专属 magic number,iOS 传了会静默忽略 - HBuilderX 版本低于 3.2.11 时,
value: -1不生效,降级为应用内亮度 - 华为 EMUI、小米 MIUI 在省电模式或后台时大概率拒绝该调用,
fail回调会触发,但无具体错误码
Android 必须动态申请 WRITE_SETTINGS 权限
uni.setScreenBrightness 在 Android 上依赖 android.permission.WRITE_SETTINGS,这不是普通运行时权限,不能用 uni.authorize,得走原生跳转设置页流程:
- 调用前先用
uni.getSystemInfoSync().platform === 'android'判断平台 - 再用
uni.getSetting检查是否已有授权,res.authSetting['scope.writeSettings']为true才能继续 - 若未授权,必须调用
uni.openSetting弹出系统设置页,引导用户手动开启「修改系统设置」开关 - iOS 和 HarmonyOS 不需要该权限,也无对应设置项
别在 onShow 里无条件调用,否则可能死循环
某些 Android 设备(尤其是旧款三星、OPPO)在屏幕亮度变化瞬间会触发页面重绘甚至 onShow 再次执行,导致无限调用 uni.setScreenBrightness,CPU 升高、页面卡死。
- 官方明确禁止在
onShow或onLoad中无防护地调用 - 推荐改用
onReady+ 防抖(如setTimeout延迟 100ms),或绑定用户显式操作(比如按钮点击) - 若必须进页即设,加标记位:
if (!this._brightnessApplied) { uni.setScreenBrightness(...); this._brightnessApplied = true; }
临时提亮后恢复亮度,要分平台写逻辑
扫码页设到最亮(value: 1),离开时还原——不能简单存个值再设回去,因为 iOS 存的是系统值,Android 存的可能是应用内值或 -1。
- 进入前用
uni.getScreenBrightness获取并存入uni.setStorageSync('prev_brightness') - 离开时(必须用
onUnload,onHide可能不触发)读取存储值 - iOS 直接设回该值;Android 建议设
value: -1(同步系统),除非你确定上次没被厂商拦截,才设原值 - 示例恢复片段:
onUnload() { const saved = uni.getStorageSync('prev_brightness'); const platform = uni.getSystemInfoSync().platform; if (platform === 'ios') { uni.setScreenBrightness({ value: Number(saved) }); } else { uni.setScreenBrightness({ value: -1 }); } }
最麻烦的不是 API 调用本身,而是 Android 厂商定制 ROM 对 WRITE_SETTINGS 的层层拦截,以及不同 HBuilderX 版本对 value: -1 的支持差异——上线前务必在华为、小米、OPPO 真机上逐个验证 fail 回调是否如期触发。











